Подтвердить что ты не робот

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

В качестве приоритета RingBuffer выделяет объекты определенного типа, как вы можете использовать один кольцевой буфер для обработки сообщений разных типов?

Вы не можете создавать экземпляры новых объектов для вставки в ringBuffer, и это приведет к поражению цели переднего распределения.

Таким образом, у вас может быть 3 сообщения в шаблоне обмена асинхронными сообщениями:

  • NewOrderRequest
  • NewOrderCreated
  • NewOrderRejected

Итак, мой вопрос: как вы собираетесь использовать шаблон Disruptor для реальных систем сообщений?

Спасибо

Ссылки: http://code.google.com/p/disruptor-net/wiki/CodeExamples

http://code.google.com/p/disruptor-net

http://code.google.com/p/disruptor

4b9b3361

Ответ 1

Один подход (наш наиболее распространенный шаблон) заключается в том, чтобы сохранить сообщение в его сортированной форме, то есть в виде байтового массива. Для входящих запросов, например. Исправление сообщений, двоичное сообщение, быстро вытаскивается из сети и помещается в кольцевой буфер. Разметка и отправка сообщений различных типов обрабатываются EventProcessors (Потребителями) в этом кольцевом буфере. Для исходящих запросов сообщение сериализуется в предварительно выделенный массив байтов, который формирует запись в кольцевом буфере.

Если вы используете некоторый массив байтов с фиксированным размером в качестве предварительно выделенной записи, для обработки переполнения больших сообщений требуется дополнительная логика. То есть выберите разумный размер по умолчанию, и если он превышен, выделите временный массив, который больше. Затем отбросьте его, когда запись будет повторно использована или использована (в зависимости от вашего варианта использования), возвращаясь к исходному предварительно распределенному массиву байтов.

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

Также нет правила против создания экземпляров объекта и передачи ссылок (мы делаем это и в нескольких местах). Вы теряете преимущества предварительного распределения объектов, однако одна из целей дизайна искажающего устройства заключалась в том, чтобы позволить пользователю выбирать наиболее подходящую форму хранения.

Ответ 2

Существует библиотека под названием Javolution (http://javolution.org/), которая позволяет вам определять объекты как структуры с полями фиксированной длины, такие как строка [40] и т.д., которые полагаются на байт-буферы внутри, а не на объекты с переменным размером... который позволяет инициализировать маркерное кольцо объектами фиксированного размера и, следовательно, (надеюсь) смежными блоками памяти, которые позволяют кешу работать более эффективно.

Мы используем это для передачи событий/сообщений и использования стандартных строк и т.д. для нашей бизнес-логики.