Kafka消息传递语义

时间:2020-09-30 13:53:58

标签: java apache-kafka kafka-consumer-api

我正在阅读Kafka documentation关于消费者的信息,并且遇到了以下消息消费定义:

我们的主题分为一组完全有序的分区,每个分区 每次订阅中只有一位消费者消费 在任何给定时间的消费群体。这意味着 每个分区中的使用者只是一个整数,即偏移量 下一条要消耗的消息。

我的措词解释如下:

使用者组从包含多个分区的主题中读取数据。然后,向该组中的每个消费者分配一些分区子集,这些子集与该组中其他消费者的分区不重叠。


请考虑以下情况:

由2个使用者RefOrValueGRP组成的使用者组C1从主题C2读取数据,该主题由两个分区TPC和{{1}组成}。

问题::如果某个时候P1P2读取而C1P1读取,则可以重新平衡,以便{{1 }}从C2开始读取,P2C1开始读取。如果是这样,在哪种情况下可能会发生?

它与上面的引用并不矛盾。

1 个答案:

答案 0 :(得分:1)

我在您的问题和评论中看到一些要讨论的事情。

  1. 您对引用段落的解释正确。

  2. 问题“如果是,在哪种情况下会发生?”: 是的,这种情况可能发生。消费者对TopicPartition分配的更改主要是通过重新平衡来触发的。在以下情况下将触发消费者重新平衡:

消费平衡在以​​下时间启动

  • 一个消费者离开了消费者组(由于未能及时发送心跳或明确要求离开)

  • 新的消费者加入了消费者组

  • 消费者更改其主题订阅

  • 消费者组注意到任何订阅的主题的主题元数据发生了变化 (例如,分区数量的增加)

[来源:Confluent Kafka开发人员的培训材料]

请记住,在重新平衡期间,所有消费者都将暂停。

  1. 您的评论“ C1在不提交偏移的情况下从P1读取了一些消息。然后它失去了与Kafka的连接并成功处理了该消息。与此同时,另一个使用者C3被创建并分配给了读取相同消息的P1。”

我认为这种情况与消费者的重新平衡无关,因为消费者C1可能只是在处理数据之后但在将数据提交给Kafka之前死亡。现在,如果重新启动使用者C1,它将再次读取相同的消息,因为它尚未提交它们。

这称为“至少一次”传递语义,当您具有例如自动提交已启用。我猜您在寻找分布式系统中的“圣杯”,它是“一次语义”:)

为此,您需要考虑从Kafka到应用程序接收器的整个应用程序。如果应用程序的输出不是幂等的,则可能无法实现一次语义化(EOS)。但是如果您的输出沉再次是Kafka,您实际上可以实现EOS。