Как Disruptor LMAX работает с несколькими производителями с общей переменной?

Я новичок в Disruptor. У меня есть следующие два запроса:

Q1. Я получил пример кода от одного производителя к одному потребителю и от одного производителя к нескольким зависимым потребителям,

Мне нравится получать образец кода для нескольких производителей для нескольких потребителей или Sequencer: 3P – 1C. Не могли бы вы сослаться на какие-нибудь блоги или образцы кода?

Q2. Это общий вопрос о том, как в среде с несколькими производителями результат одного производителя будет связан с результатом предыдущего производителя в кольцевом буфере.

например: Disruptor можно использовать в среде, где один файл/переменная обновляется несколькими производителями. т. е. есть два производителя (P1, P2), которые обновляют одну общую переменную (названную как «count»). (Здесь count — это переменная экземпляра в классе ValueEvent)

Изначально значение «count» равно 0.

Производитель P1 добавит 1 к текущему значению "count". Таким образом, после обработки производителя P1 значение count будет (0+1) = 1.

Производитель P2 добавит 2 к текущему значению «count», поэтому после обработки производителя P2 значение count будет (1 + 2) = 3.

По сути, P2 должен прочитать обновленное значение «счетчика» (сделанное P1) из кольцевого буфера и добавить увеличенное значение (2).

Как мы можем поддерживать порядок выполнения производителей? (P2 всегда будет выполняться после выполнения P1.)

На стороне потребителя потребители (C1,C2) будут считывать значение «count» как последовательно (1,3,.,.,.). Это нормально, так как в кольцевом буфере каждый потребитель будет считывать значение кольцевого буфера только в последовательном порядке.

Спасибо, Прасенджит.


person Prasenjit Patra    schedule 23.05.2012    source источник


Ответы (2)


q1: Нет примеров, но если вы используете реализацию Java, вам нужно использовать ProducerBarrier, если вы хотите, чтобы несколько действительно независимых производителей.

q2: Но ваш Q2 говорит мне, что у вас нет независимых продюсеров в вашем разрушителе. Поскольку есть зависимость P1, затем P2, затем {C1,C2}. Представьте, что P2 является «потребителем», который обновляет другую переменную (не ту переменную, которую обновляет P1), а C1 и C2 следуют за P2.

Например: P1 действительно count=0+1. P2 считает2=1+2=3. C1 и C2 читают переменную count2. Затем настройте свой дисраптор так, чтобы он имел P1->P2->{C1,C2}. P2 не начнет обработку, пока не завершится P1. C1 и C2 не начнут обработку, пока P2 не будет завершен.

Если вам нужна максимальная производительность, вам придется позаботиться о совместном использовании строк кэша между двумя счетчиками.

person jasonk    schedule 23.05.2012

  1. Я написал пример проекта, чтобы проиллюстрировать несколько производителей - один потребитель. Вот ссылка: http://krishnansrinivasan.wordpress.com/2012/07/29/using-disruptor-net-with-wcf-2/

  2. Производители никогда не обновляют состояние переменной, абстрагируемой RingBuffer. Кольцевой буфер помогает только в строгой последовательности вызовов потребителю на основе порядка, в котором он получает сообщение от производителя.

person Krishnan    schedule 31.07.2012