Хотите внедрить задержанного потребителя с использованием потребителя высокого уровня api
Основная идея:
- выводить сообщения по ключу (каждый msg содержит временную метку создания), это гарантирует, что каждый раздел заказал сообщения по времени.
- auto.commit.enable = false (будет явно передаваться после каждого процесса сообщения)
- потребляет сообщение
- отметьте метку сообщения и проверьте, прошло ли достаточно времени.
- сообщение процесса (эта операция никогда не будет завершена)
-
совершить 1 смещение
while (it.hasNext()) { val msg = it.next().message() //checks timestamp in msg to see delay period exceeded while (!delayedPeriodPassed(msg)) { waitSomeTime() //Thread.sleep or something.... } //certain that the msg was delayed and can now be handled Try { process(msg) } //the msg process will never fail the consumer consumer.commitOffsets //commit each msg }
некоторые опасения по поводу этой реализации:
- фиксация каждого смещения может замедлить ZK вниз
- Может ли user.commitOffset выдавать исключение? если да, я буду использовать одно и то же сообщение дважды (можно решить с помощью идемпотентных сообщений)
- проблема, ожидающая долгого времени без фиксации смещения, например, период задержки составляет 24 часа, будет дальше от итератора, спать в течение 24 часов, обрабатывать и совершать (тайм-аут сеанса ZK?)
- Как может ZK-сеанс оставаться в живых без каких-либо новых смещений? (установка улья zookeeper.session.timeout.ms может разрешить в мертвом потребителе, не распознавая его).
- какие-либо другие проблемы отсутствуют?
Спасибо!