Обработка необработанных записей в Kafka при восстановлении / ребалансировке - PullRequest
1 голос
/ 15 января 2020

Я использую Spring Kafka для взаимодействия с моим экземпляром Kafka. Предположим, что у меня есть одна topi c с, скажем, 2+ разделами.

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

(Это основано на стратегии, о которой я читал в книге О'Рейли.)

Есть ли лучший способ справиться с этой ситуацией, чтобы реализовать семантику «ровно один раз» и не пропустить ни одного ожидающего сообщения? Или есть лучший / более идиоматический c способ с Spring Kafka для решения этой ситуации?

Заранее спасибо.

1 Ответ

1 голос
/ 15 января 2020

Есть ли причина, по которой вы не проверяете свои смещения непосредственно для kafka?

Как правило, ваши варианты обработки "ровно один раз" следующие:

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