我对 Disruptor 有点陌生,但经过广泛的测试和试验,我可以说 ProducerType.MULTI 对于 2 个或更多生产者线程更准确、更快。
在 MacBook 上有 14 个生产者线程时,ProducerType.SINGLE 显示已发布的事件多于消耗的事件,即使我的测试代码正在等待所有生产者结束(它们在 10 秒运行后执行),然后等待破坏者结束。不太准确:那些额外发布的事件去哪儿了?
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,发布的事件比使用 SINGLE 少,但实际上在 10 秒内消耗的事件比使用 SINGLE 的要多。使用 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 通过获取下一个 slot,更新事件,然后发布 slot,直接发布到 ring buffer。每当调用其 onEvent 方法时,处理程序都会获取事件。没有额外的队列。很简单。