LMAX Disruptor Timeout EventHandler

У нас есть система, использующая среду Disruptor, она имеет пять зарегистрированных этапов реализации EvenetHandler.

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

У нас проблема с третьим этапом, это узкое место, которое занимает много времени, так как оно выполняет различные HTTP-вызовы и сохраняет ответ в объекте запроса.

Итак, мы хотим продвинуть запрос (с любым ответом) на четвертый и пятый этап после того, как некоторое время было потрачено на третьем этапе.

Как я могу тайм-аут на каком-либо конкретном этапе (в данном случае на третьем этапе) и принудительно переместить запрос на следующий этап?

Или же,

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

1 ответ

Решение, которое мы попробовали

  1. Иметь поток обнаружения зависания, который отслеживает последовательности, обрабатываемые этапом (или всеми этапами). Имейте информацию о синхронизации в самом обработчике событий.
  2. По тайм-ауту прервите поток процессора событий. Что должно заставить обработчик событий выйти из вращения, которое он делает. Итак, здесь мы потеряли поток (или один из потоков), обрабатывающий этап
  3. Замените поток обработчика событий.

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

Другие вопросы по тегам