LMAX的Disruptor如何与具有共享变量的多个生产者一起工作?

时间:2012-05-23 06:00:11

标签: shared producer-consumer disruptor-pattern

我是Disruptor的新手。我有以下两个问题:

Q1。我得到了一个示例代码one producer to one consumerone producer to multiple dependent consumers

我想为多个消费者或序列发生器获取多个生产者的示例代码:3P - 1C。您可以向我推荐任何博客或代码示例吗?

Q2。这是一个关于多生产者环境的一般性问题,一个生产者结果如何与环形缓冲区中先前生产者的结果相互关联。

例如:Disruptor可以在多个生产者更新单个文件/变量的环境中使用。即有两个生成器(P1,P2),它们正在更新单个共享变量(名为“count”)。(此处count是ValueEvent类中的实例变量)

最初“count”值为0.

生产者P1将使用“计数”当前值加1。因此,在处理生产者P1之后,count的值将为(0 + 1)= 1。

生产者P2将使用“count”当前值加2,因此在生成器P2处理后,count的值将为(1 + 2)= 3.

基本上,P2需要从环形缓冲区读取更新的“计数”值(由P1完成)并添加递增的值(2)。

我们如何维持生产者的执行顺序?(P2将在P1执行后始终执行。)

在消费者方面,消费者(C1,C2)将按顺序读取“计数”值(1,3,。,。,。)。这是可以的,因为在环形缓冲区中,每个消费者只会按顺序读取环形缓冲区值。

谢谢, 杜

2 个答案:

答案 0 :(得分:0)

q1:没有示例 - 但假设您正在使用Java实现,那么如果您需要多个真正独立的生产者,则需要使用ProducerBarrier。

问题2:但是你的Q2告诉我你的破坏者并没有完全独立的制作人。由于存在依赖性P1,因此P2然后是{C1,C2}。想想P2是一个“消费者”,它更新了一个不同的变量(不是P1更新的同一个变量),而C1& C2则是P2。

例如:P1确实计数= 0 + 1。 P2确实count2 = 1 + 2 = 3。 C1& C2读取“count2”变量。然后将您的干扰器设置为具有P1-> P2-> {C1,C2}。 P1完成后才会开始处理P2。 C1&在P2完成之前,C2不会开始处理。

如果您处于最佳性能之后,则必须注意两个计数器之间的缓存线共享。

答案 1 :(得分:0)

  1. 我编写了一个示例项目来说明多个生产者 - 单个消费者。 链接在这里: http://krishnansrinivasan.wordpress.com/2012/07/29/using-disruptor-net-with-wcf-2/

  2. 生产者永远不会更新由RingBuffer抽象的变量的状态。 Ringbuffer仅根据从生产者处收到消息的顺序,帮助对消费者的呼叫进行严格的排序。