Lmax Disruptor, много потребителей - как заставить потребителя принимать только сообщения определенного типа и действовать независимо?

Я планирую иметь много параллельных потребителей в моем дисрапторе.

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

Например, у меня есть сообщения типов A, B, C, и у меня есть буфер, например

 #1 - type A, #2 - type B, #3 - type C,  #4 - type A, #5 - type C, #6 - type C,  (and so on)

У меня есть потребители для каждого из типов. Как мне добиться, чтобы потребитель для А принимал сообщения 1 и 4, для типа Б — сообщение 2, С — сообщения 3, 5, 6?

Важно: я хочу, чтобы обработка была независимой. Потребители не должны быть объединены в цепочку, каждый из которых перемещается по буферу независимо. Обработка #6 потребителем "типа C" может происходить раньше, чем #1 для типа A, если потребитель для A медленнее, чем для C.

Я ценю объяснение, как это сделать с конфигурацией разрушителя LMAX.


person Askar Ibragimov    schedule 12.04.2017    source источник


Ответы (2)


Типичным шаблоном является использование порядкового номера — скажем, у вас есть 4 обработчика событий, висящих на разрушителе; если вы дадите каждому уникальный номер, вы можете выбрать, принимать сообщение или нет:

void onEvent(T event, long sequence, boolean endOfBatch) throws Exception {
    // instanceNumber could be assigned in a constructor 
   if ((sequence % 4) != instanceNumber) 
        // message isn't for me
        return;
   }
   // do my thing
}
person Chris Mowforth    schedule 18.04.2017

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

person G. Fiedler    schedule 12.04.2017