gpt4 book ai didi

java - Kafka Streams 在生成主题时不会将偏移量增加 1

转载 作者:搜寻专家 更新时间:2023-11-01 02:35:35 26 4
gpt4 key购买 nike

我实现了一个简单的 Kafka 死信记录处理器。

它在使用控制台制作者生成的记录时完美运行。

但是我发现我们的 Kafka Streams 应用程序不保证向接收器主题生成记录时,偏移量将针对每条生成的记录递增 1。

死信处理器背景:

我有一个场景,在发布处理记录所需的所有数据之前,可能会收到记录。当记录与流应用程序的处理不匹配时,它们将移至死信主题,而不是继续向下流。发布新数据时,我们会将死信主题中的最新消息转储回流应用程序的源主题,以便使用新数据进行重新处理。

死信处理器:

  • 在运行应用程序开始时记录每个分区的结束偏移量
  • 结束偏移量标记停止处理给定死信主题记录的点,以避免在重新处理的记录返回死信主题时无限循环。
  • 应用程序从上一次运行通过消费者组产生的最后一个 Offsets 恢复。
  • 应用程序正在使用事务和 KafkaProducer#sendOffsetsToTransaction 提交最后生成的偏移量。

为了跟踪我的范围内的所有记录何时针对主题分区进行处理,我的服务将其最后生成的生产者偏移量与消费者保存的结束偏移量映射进行比较。当我们到达结束偏移量时,消费者通过 KafkaConsumer#pause 暂停该分区,当所有分区都暂停时(意味着它们达到保存的结束偏移量)然后调用它退出。

Kafka Consumer API状态:

Offsets and Consumer Position Kafka maintains a numerical offset for each record in a partition. This offset acts as a unique identifier of a record within that partition, and also denotes the position of the consumer in the partition. For example, a consumer which is at position 5 has consumed records with offsets 0 through 4 and will next receive the record with offset 5.

Kafka Producer API引用下一个偏移量也总是 +1。

Sends a list of specified offsets to the consumer group coordinator, and also marks those offsets as part of the current transaction. These offsets will be considered committed only if the transaction is committed successfully. The committed offset should be the next message your application will consume, i.e. lastProcessedMessageOffset + 1.

但是您可以在我的调试器中清楚地看到,单个分区消耗的记录不会一次递增 1... enter image description here

我认为这可能是 Kafka 配置问题,例如 max.message.bytes 但没有一个真正有意义。然后我想也许是因为加入,但没有看到任何方式可以改变制作人的运作方式。

不确定是否相关,但我们所有的 Kafka 应用程序都使用 Avro 和 Schema Registry...

无论生产方法如何,偏移量是否应该始终递增 1,或者使用 Kafka 流 API 是否可能无法提供与普通生产者消费者客户端相同的保证?

我是否完全缺少某些东西?

最佳答案

即使 JavaDocs 表明了这一点(似乎应该更新 JavaDocs),消息偏移量增加 1 也不是官方 API 契约(Contract)。

  • 如果您不使用事务,您要么获得至少一次语义,要么得不到任何保证(有些人称之为最多一次语义)。对于至少一次,记录可能被写入两次,因此,由于重复写入“消耗”了两个偏移量,因此两个连续消息的偏移量实际上并没有增加一个。

  • 如果您使用事务,事务的每次提交(或中止)都会将一个提交(或中止)标记写入主题——这些事务标记也会“消耗”一个偏移量(这是您观察到的)。

因此,一般来说你不应该依赖连续的偏移量。您获得的唯一保证是,每个偏移量在分区内都是唯一的。

关于java - Kafka Streams 在生成主题时不会将偏移量增加 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54636524/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com