disruptor中多线程消费者的疑问
请教下大家,关于disruptor 中的消费者
就拿通俗包装产品做个例子, 生产者生产出产品后,将产品放入 ringBuffer, 然后消费者从ringBuffer中取得产品进行包装。
我理解的 在disruptor中,生产者当然可以是多个,即多线程来处理,多个生产者同时向ringBuffer中填充产品,这个由disruptor来处理并行写入问题。
问题是,在大多数场景中,我们不光需要 并行的生产者,更需要并行的消费者。
而在 disruptor 框架中,如果我们定义了多个 EventHandler 的实例, 这些EventHandler 都会对每个产品 消费一次,
例如:
disruptor.handleEventsWith( new HelloEventHandler("first")
,new HelloEventHandler("second");
执行的结果是:
handler2-----pool-1-thread-2------:0
handler1-----pool-1-thread-1------:0
handler2-----pool-1-thread-2------:1
handler1-----pool-1-thread-1------:1
handler2-----pool-1-thread-2------:2
handler1-----pool-1-thread-1------:2
handler2-----pool-1-thread-2------:3
handler1-----pool-1-thread-1------:3
从上述结果可以看到 , 每一个handler是启动了一个线程来处理,但是其从RingBuffer中取出的数据会重复。
例子是参考:
Disruptor实例:单生产者-多消费者 , 这篇文章的内容: http://www.jdon.com/44868
我本来的目的是希望 HelloEventHandler 的这两个实例可以分别启动线程并行执行,以并行消费产品。
但事实上, 生产者没产出一个产品, 每个消费者实例都会重复的执行一遍。
因此我想问一下,在disruptor 应该如何来实现 有多个消费者线程 同时来获取RingBuffer中的产品,而不会重复执行呢
难道必须在EventHandler中自行判断当前所传递的事件是否已经被消费过才可以的吗?
如果这样的话,消费者中判断是否已处理过产品,岂不又涉及到多线程问题了。
另外也想听取一下 大家对 Disruptor中 启动消费者数量的建议,系统中启动多少生产者,多少消费者 ,有哪些衡量点和参考。
谢谢。
[该贴被oleio于2013-05-04 17:04修改过]