我對Disruptor有點新,但經過廣泛的測試和試驗後,我可以說ProducerType.MULTI對於2個或更多生產者線程更加準確和快速。
在MacBook上有14個生產者線程,即使我的測試代碼正在等待所有生產者結束(他們在10秒後運行),然後等待干擾者,ProducerType.SINGLE顯示更多發佈的消息事件結束。不太準確:這些額外發布的活動去哪裏了?
Driver start: PID=38619 Processors=8 RingBufferSize=1024 Connections=Reuse Publishers=14[SINGLE] Handlers=1[BLOCK] HandlerType=EventHandler<Event>
Done: elpased=10s eventsPublished=6956894 eventsProcessed=4954645
Stats: events/sec=494883.36 sec/event=0.0000 CPU=82.4%
使用ProducerType.MULTI,更少的事件發表過單,但更多的事件實際消耗在同樣的10秒多單。並與MULTI,公佈事件的所有被消耗,這正是我所期望的,由於路上小心經過的時間到期後,司機自行關閉:
Driver start: PID=38625 Processors=8 RingBufferSize=1024 Connections=Reuse Publishers=14[MULTI] Handlers=1[BLOCK] HandlerType=EventHandler<Event>
Done: elpased=10s eventsPublished=6397109 eventsProcessed=6397109
Stats: events/sec=638906.33 sec/event=0.0000 CPU=30.1%
還是那句話:2周或以上的生產者:使用ProducerType.MULTI。
順便說一句,每個Producer通過獲取下一個插槽,更新事件,然後發佈插槽,直接發佈到環形緩衝區。處理程序在調用onEvent方法時獲取事件。沒有額外的隊列。很簡單。
謝謝,亞歷克斯。你的建議聽起來很有希望。我想,Java'SynchronousQueue'可以用於這個目的。此外,我正在考慮另一種解決方案。我們可以使用0MQ爲每個生產者發送消息。對於單個接收方來說,線程不斷地輪詢生產者通道並且發送它通過干擾者獲得的任何消息。所以干擾者似乎贊成單一作家的原則...... :-) –
是的。使用0MQ基本上是讓0MQ接收線程成爲「隊列合併」線程。如果你的系統現在已經在使用0MQ,那肯定夠用了。 –
破壞者的原始動機之一是在收集框架中排隊的表現不佳。上面概述的設計同樣適用於使用多個干擾器而不是每個隊列。儘管取決於你的工作負載,但你可能會發現,只需添加一堆內存副本和上下文切換,只需一個多生產者就可以更快地處理多個隊列。 –