Springboot Kafka - потребительская идемпотентность - PullRequest
1 голос
/ 11 марта 2020

У меня есть приложение Spring-boot, которое слушает кафку. Чтобы избежать дублирования обработки, я пытаюсь выполнить ручную фиксацию. Для этого я сослался на Асинхронное принятие сообщения сразу после чтения из topi c. Но я застрял на том, как мне достичь потребительской идемпотентности , чтобы записи не обрабатывались дважды.

1 Ответ

3 голосов
/ 11 марта 2020

Не существует такого понятия, как идемпотентный (ровно один раз) потребитель с Кафкой.

Кафка действительно обеспечивает семантику ровно один раз для

kafkaRead -> process -> kafkaWrite

Но " ровно один раз »относится только ко всему потоку. Шаг process равен at least once.

Другими словами, смещение для чтения фиксируется только в случае успешной записи. Если запись не удалась, чтение / обработка / запись будет выполнена снова.

Это реализовано с использованием транзакций Кафки .

Если вы взаимодействуете с каким-либо другим хранилищем в шаг process (или вообще не выполняет запись kafka - kafkaRead -> process), вы должны написать свой собственный идемпотентный (дедупликационный) код.

Но это относительно просто, потому что запись потребителя имеет уникальный ключ через topic/partition/offset - просто сохраните данные с данными и убедитесь, что вы еще не обработали эту запись.

Kafka поддерживает идемпотентных продуцентов.

...