2012-05-23 4 views
0

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

Q1. Я получил пример кода one producer to one consumer и one producer to multiple dependent consumers,

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

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

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

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

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

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

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

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

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

Thanks, Prasenjit.

ответ

0

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

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

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

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

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

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

Смежные вопросы