#apache-kafka #apache-kafka-streams
Вопрос:
у меня есть DSL-приложение Kafka Streams, у нас есть требование к обработке ровно один раз, для того же я добавил конфигурацию
streamConfig.put(processing.gurantee, "exactly_once");
Я использую кафку 2.7
У меня есть 2 запроса
- в чем разница между exactly_once и exactly_once_beta
- как мне проверить эту функциональность, чтобы убедиться, что мои сообщения обрабатываются только один раз
Спасибо!
Ответ №1:
exactly_once_beta
это улучшение по exactly_once
сравнению с предыдущим . В то время exactly_once
как использует транзакционный производитель для каждой потоковой задачи (комбинация субтопологии и входного раздела, exactly_once_beta
использует транзакционный производитель для каждого потока потока клиента потоков Кафки. Каждый производитель поставляется с отдельными буферами памяти, отдельным потоком, отдельными сетевыми подключениями, которые могут ограничить масштабирование количества входных разделов (т. Е. Количество задач). Большое количество производителей также может привести к увеличению нагрузки на брокеров. Следовательно, exactly_once_beta
имеет лучшие характеристики масштабирования. Более подробную информацию вы можете найти в KIP-447.
Обратите внимание, что это exactly_once
будет устаревшим и exactly_once_beta
будет переименовано exactly_once_v2
в Apache Kafka 3.0. Более подробную информацию см. в KIP-732.
Для тестов вы можете черпать вдохновение из тестов в репозитории Apache Kafka:
- https://github.com/apache/kafka/blob/trunk/streams/src/test/java/org/apache/kafka/streams/integration/EosIntegrationTest.java
- https://github.com/apache/kafka/blob/trunk/streams/src/test/java/org/apache/kafka/streams/integration/EOSUncleanShutdownIntegrationTest.java
- https://github.com/apache/kafka/blob/trunk/tests/kafkatest/tests/streams/streams_eos_test.py
В принципе, вам необходимо создать сценарий отработки отказа и убедиться, что сообщения не создаются несколько раз в выходных разделах. Обратите внимание, что сообщения могут обрабатываться несколько раз, но результаты в выходных разделах должны отображаться так, как если бы они были обработаны только один раз. Вы можете найти довольно хорошую лекцию о семантике «один раз», которая также объясняет сценарии отработки отказа здесь: https://www.confluent.io/kafka-summit-london18/dont-repeat-yourself-introducing-exactly-once-semantics-in-apache-kafka/