Disruptor: пример ведения журнала
Мне было любопытно относительно наиболее распространенных (или рекомендуемых) реализаций прерывателя о шаге журналирования. И самые распространенные мои вопросы:
- как это на самом деле реализовано (на примере)?
- Разумно ли использовать JPA?
- Какая БД обычно используется (сообществом, которое уже внедрило проекты с нарушителем)?
- Разумно ли использовать его в промежуточных обработчиках (EventProcessors), чтобы сохранять состояние каждого сообщения, а не до и после процесса бизнес-логики?
Кстати (извините, я знаю, что это не связано с этапом журналирования), как правильно удалить сообщение из RingBuffer во время процесса eventHandler (при условии, что сообщение устарело / истекло и должно быть удалено вся процедура). Мне было интересно нечто похожее на паттерн Dead Letter Channel.
Ура!
1 ответ
Разрушитель обычно используется для обработки с малой задержкой и высокой пропускной способностью. Например, миллионы сообщений с типичной задержкой в сотни микросекунд. Поскольку очень немногие базы данных могут справляться с такой скоростью обновления с разумно ограниченными задержками, ведение журнала часто выполняется для необработанного файла с репликацией во вторую (или третью) систему.
В целях отчетности система читает этот файл или прослушивает сообщения и обновляет базу данных настолько быстро, насколько это возможно, но это исключено из критического пути.
Запись в кольцевом буфере не работает, когда ее обработал каждый обработчик событий.
Слот, который использует сообщение, недоступен, пока каждый обработчик событий не обработает его и все сообщение перед ним. Удаление сообщения будет слишком дорогим, как с точки зрения производительности, так и влияния на дизайн.
Каждый обработчик событий видит каждое сообщение. Поскольку это происходит одновременно, это не требует больших затрат, но вполне нормально, что обработчики событий игнорируют сообщения в результате. (возможно большинство сообщений)