apache-kafka - 我如何在我的 kafka 流应用程序中测试 Exactly Once Semantics
问题描述
我有一个 Kafka Streams DSL 应用程序,我们要求只处理一次,同样我已经添加了配置
streamConfig.put(processing.gurantee, "exactly_once");
我正在使用 kafka 2.7 我有 2 个查询
- exact_once 和 exact_once_beta 有什么区别
- 我如何测试此功能以确保我的消息只被处理一次
谢谢!
解决方案
exactly_once_beta
是一个改进exactly_once
。虽然exactly_once
为每个流任务使用事务生产者(子拓扑和输入分区的组合,exactly_once_beta
但对 Kafka Streams 客户端的每个流线程使用事务生产者。每个生产者都带有单独的内存缓冲区、单独的线程、单独的网络连接,这可能限制缩放输入分区的数量(即任务的数量)。大量生产者也可能导致代理的负载增加。因此,exactly_once_beta
具有更好的缩放特性。您可以在KIP-447中找到更多详细信息。
请注意,exactly_once
它将被弃用,并将在 Apache Kafka 3.0exactly_once_beta
中重命名为。有关详细信息,exactly_once_v2
请参阅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-在-apache-kafka/
推荐阅读
- java - Bind existence of a value in ObservableSet to property
- html - Angular7 - 使用函数刷新搜索栏(输入范围)的问题
- symfony - 使用 Symfony Serializer 时如何修复 DateTimeNormalizer 问题
- c# - 是否应该在交易处理完毕后返回?
- android - 在 PageViewer 中应用之前如何使用 Glide 减小图像大小?
- node.js - 如何在不创建 Azure 应用(在应用注册处)的情况下对 Azure AD 中的用户进行身份验证?
- php - 如何修复 Laravel 中的“函数 App\Http\Controllers\..\Controller::edit() 的参数太少,通过 0 并且预期正好 1”错误
- c - C CORTEX-M4:如何访问 UART (vcom) 发送的 uint8_t 数据为 int32_t
- hadoop - CSV 文件和具有不同行数的外部表
- android - 使用房间库时,数据库中的数据总是返回空数组