disruptor中多线程消费者的疑问

13-05-04 oleio
    

请教下大家,关于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修改过]

    

1
banq
2013-05-05 08:02

2013-05-04 16:16 "@oleio

"的内容

其从RingBuffer中取出的数据会重复 ...

不会重复,可能是你测试代码有问题。

oleio
2013-05-05 13:25

谢谢 banq 的回复,我指的重复是

disruptor.handleEventsWith( new HelloEventHandler("first")

,new HelloEventHandler("second");

这是两个HelloEventHandler类的实例 ,

运行时 HelloEventHandler("first") 这个业务处理类执行过的 产品,另一个业务处理类 HelloEventHandler("second") ,也会执行一遍。

tangxuehua
2013-05-05 13:46

disruptor是pub-sub模式,

你publish了一个事件,当然是所有的event handler都会响应的啊?这样有什么不对吗?pub-sub这种模式就是广播机制呀。你是不是希望虽然可以有多个event handler,但只能有一个event handler可以执行,也就是争抢着执行?

oleio
2013-05-05 14:32

谢谢回复

是这样的,同类型的 比如 都是 HelloEventHandler 的消费者,希望它们以抢占的方式来消费 RingBuffer 中的产品。

而不同类型的消费者,比如 HelloEventHandler 与 ByeEventHandler ,那么它们就是保持原先的广播机制 来处理。

请问 disruptor 支持这种抢占模式吗?

4Go 1 2 3 4 下一页