Apache kafka 融合云上的ApacheKafka——分区主题和消费者延迟中的非相干偏移
在融合云上使用卡夫卡时,我发现了一种奇怪的行为。我创建了一个具有默认分区值的主题:6 我的系统由一个Java Producer应用程序和一个Kafka Streams应用程序组成,前者向该主题发送消息,后者从中读取消息并对每条消息执行操作Apache kafka 融合云上的ApacheKafka——分区主题和消费者延迟中的非相干偏移,apache-kafka,apache-kafka-streams,spring-cloud-stream,confluent-platform,confluent-cloud,Apache Kafka,Apache Kafka Streams,Spring Cloud Stream,Confluent Platform,Confluent Cloud,在融合云上使用卡夫卡时,我发现了一种奇怪的行为。我创建了一个具有默认分区值的主题:6 我的系统由一个Java Producer应用程序和一个Kafka Streams应用程序组成,前者向该主题发送消息,后者从中读取消息并对每条消息执行操作 ----------------------- -------- ----------- | Kafka Java Producer | ----> | topic | ----> | KStr
----------------------- -------- -----------
| Kafka Java Producer | ----> | topic | ----> | KStream |
----------------------- -------- -----------
目前,我只启动Kafka Streams应用程序的一个实例,因此消费者组有一个成员
这是我观察到的:
events.foreach { key, value ->
logger.info("--------> Processing TimeMetric {}", value)
//Store in DB
日志
[-StreamThread-1]持续时间$$EnhancerBySpringCGLIB$$e72e3f00:---------->处理事件{..
events-processor-19549050-d8b0-4b39…
。如前所述,该组只有一个成员(KStream的唯一实例)。但是,如果显示该组位于分区2中的一条消息后面。此外,请注意,当前偏移量似乎为1,结束偏移量为2):[-StreamThread-1]uration$$EnhancerBySpringCGLIB$$e72e3f00:---------->处理事件{
对于第一个问题,有两种可能性(尽管通过阅读第二个问题,您似乎正在使用事务):
- 如果没有使用一次语义,则制作人可能会发送多条消息,因为无法控制之前发送的内容。这样,卡夫卡默认的至少一次语义可能会因为这些重复消息而增加偏移量>+1
- 如果您只使用一次语义或事务,则事务的每个事件都会在主题中写入一个标记,用于内部控制。这些标记会导致+2增加,因为它们也存储在主题中(但消费者会避免)。此外,还有一些关于此行为的信息: 生产者发起提交(或中止)后,协调器 开始两阶段提交协议 在第一阶段,协调器将其内部状态更新为 “准备提交”并在事务日志中更新此状态。一次 完成后,无论发生什么情况,都将保证提交事务 什么 然后,协调器开始第2阶段,在该阶段写入事务 将标记提交到主题分区,主题分区是 交易 这些事务标记不向应用程序公开,而是 由处于read_committed模式的使用者用于从中筛选消息 中止的事务,并且不返回作为打开的一部分的消息 事务(即日志中的事务,但没有 与之关联的事务标记) 写入标记后,事务协调器将标记 事务处理为“完成”,生产商可以开始下一个 交易
希望有帮助!你猜对了,我使用的是精确的语义。非常感谢你的详细解释和参考资料,这让我发疯;-)很高兴它帮助了我,伙计!这是一个已知的问题: