Моя система имеет два разных типа сообщений - тип A и B. Каждое сообщение имеет другую структуру: тип A содержит член int, а тип B содержит двойной член. Моя система должна передавать оба типа сообщений для многочисленных потоков бизнес-логики. Уменьшение задержки очень важно, поэтому я расследую использование Disruptor для передачи сообщений из основного потока в потоки бизнес-логики с механической симпатией.
Моя проблема заключается в том, что разрушитель принимает только один тип объекта в кольцевом буфере. Это имеет смысл, потому что прерыватель предварительно выделяет объекты в кольцевом буфере. Однако это также затрудняет передачу двух разных типов сообщений в потоки бизнес-логики через Disruptor. Из того, что я могу сказать, у меня есть четыре варианта:
-
Настройте разрушитель на использование объектов, содержащих массив байтов с фиксированным размером (как рекомендовано Как следует использовать Disruptor (Pattern Disruptor) для сборки реальные системы сообщений?). В этом случае основной поток должен кодировать сообщения в массивы байтов, прежде чем публиковать их в прерыватель, и каждый из потоков бизнес-логики должен декодировать массивы байтов обратно в объекты при получении. Недостатком этой настройки является то, что потоки бизнес-логики по-настоящему не разделяют память от разрушителя - вместо этого они создают новые объекты (и, таким образом, создают мусор) из массива байтов, предоставляемого разрушителем. Поверхность этой установки заключается в том, что все потоки бизнес-логики могут считывать несколько разных типов сообщений от одного и того же прерывателя.
-
Настройте разрушитель на использование одного типа объектов, но создайте несколько разрывов, по одному для каждого типа объекта. В приведенном выше случае были бы два отдельных разрушителя: один для объектов типа A и другой для объектов типа B. Поверхность этой установки заключается в том, что основной поток не должен кодировать объект в массив байтов, а бизнес-логические потоки могут использовать те же объекты, что и в разрушителе (без мусора). Недостатком этой настройки является то, что каким-то образом каждый поток бизнес-логики должен будет подписаться на сообщения от нескольких разрывов.
-
Сконфигурируйте разрушитель для использования одного типа "супер" объекта, который содержит все поля обоих сообщений A и B. Это очень против стиля OO, но позволит компромисс между опциями №1 и №2.
-
Настройте разладчик на использование ссылок на объекты. Тем не менее, в этом случае я теряю преимущества производительности предварительного распределения объектов и порядка памяти.
Что вы рекомендуете для этой ситуации? Я считаю, что вариант №2 - самое чистое решение, но я не знаю, могут ли пользователи технически подписываться на сообщения от нескольких разрывов. Если кто-то может предоставить пример того, как реализовать вариант № 2, это было бы очень полезно!