LMAX Disruptor Timeout EventHandler
У нас есть система, использующая среду Disruptor, она имеет пять зарегистрированных этапов реализации EvenetHandler.
Этапы работают в последовательности, поэтому запрос может перейти на второй этап, только когда первый этап завершен, это движение поддерживается Disruptor внутри.
У нас проблема с третьим этапом, это узкое место, которое занимает много времени, так как оно выполняет различные HTTP-вызовы и сохраняет ответ в объекте запроса.
Итак, мы хотим продвинуть запрос (с любым ответом) на четвертый и пятый этап после того, как некоторое время было потрачено на третьем этапе.
Как я могу тайм-аут на каком-либо конкретном этапе (в данном случае на третьем этапе) и принудительно переместить запрос на следующий этап?
Или же,
Есть ли способ зарегистрировать какое-то событие, которое срабатывает после определенного времени ожидания, это может быть что-то вроде системного таймаута?
1 ответ
Решение, которое мы попробовали
- Иметь поток обнаружения зависания, который отслеживает последовательности, обрабатываемые этапом (или всеми этапами). Имейте информацию о синхронизации в самом обработчике событий.
- По тайм-ауту прервите поток процессора событий. Что должно заставить обработчик событий выйти из вращения, которое он делает. Итак, здесь мы потеряли поток (или один из потоков), обрабатывающий этап
- Замените поток обработчика событий.
Решение требует написания нашего собственного обработчика событий, который осведомлен о прерываниях, и обеспечения для динамического добавления этапов событий в разрушитель