首页 > 解决方案 > 我如何在我的 kafka 流应用程序中测试 Exactly Once Semantics

问题描述

我有一个 Kafka Streams DSL 应用程序,我们要求只处理一次,同样我已经添加了配置

streamConfig.put(processing.gurantee, "exactly_once");

我正在使用 kafka 2.7 我有 2 个查询

  1. exact_once 和 exact_once_beta 有什么区别
  2. 我如何测试此功能以确保我的消息只被处理一次

谢谢!

标签: apache-kafkaapache-kafka-streams

解决方案


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 ://www.confluent.io/kafka-summit-london18/dont-repeat-yourself-introducing-exactly-once-semantics-在-apache-kafka/


推荐阅读