Java 卡夫卡消息传递语义

Java 卡夫卡消息传递语义,java,apache-kafka,kafka-consumer-api,Java,Apache Kafka,Kafka Consumer Api,我正在阅读有关消费者的信息,并面临以下信息消费定义: 我们的主题分为一组完全有序的分区,每个分区 在每次订阅中,只有一个消费者使用它 任何给定时间的消费者群体。这意味着 每个分区中的使用者只是一个整数,即偏移量 要使用的下一条消息的 我对措辞的解释如下: 使用者组从由多个分区组成的主题中读取数据。然后为组中的每个使用者分配一些分区子集,这些分区与组中其他使用者的分区不重叠 考虑以下情况: 由两个消费者组成的消费者组GRP从主题TPC读取数据,主题TPC由两个分区组成P1和P2 问题:如果在某个

我正在阅读有关消费者的信息,并面临以下信息消费定义:

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

我对措辞的解释如下:

使用者组从由多个分区组成的主题中读取数据。然后为组中的每个使用者分配一些分区子集,这些分区与组中其他使用者的分区不重叠


考虑以下情况:

由两个消费者组成的消费者组
GRP
从主题
TPC
读取数据,主题
TPC
由两个分区组成
P1
P2

问题:如果在某个点上
C1
P1
读取,而
C2
P2
读取,它是否可以重新平衡,以便
C1
P2
开始读取,从
P1
开始读取。如果是,在什么情况下会发生这种情况


这与上面的引述并不矛盾。

我认为在你的问题和评论中有一些事情需要讨论

  • 你对引用段落的解释是正确的

  • 问题“如果是,在何种情况下可能发生?” 是的,这种情况可能发生。消费者对主题分区的分配变化主要是通过重新平衡触发的。在以下情况下,将触发消费者再平衡:

  • 消费者再平衡在以下情况下启动:

    • 消费者离开消费者组(通过未能及时发送心跳或明确请求离开)

    • 新消费者加入消费群体

    • 消费者更改其主题订阅

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

    [来源:合流卡夫卡开发者培训材料]

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

  • 您的注释“C1从P1读取了一些消息,但没有提交偏移量。然后它失去了与Kafka的连接并成功地处理了该消息。同时,另一个使用者C3被创建并分配给读取相同消息的P1。”
  • 我认为这种情况与消费者再平衡无关,因为你的消费者C1可能在处理完数据后,但在提交回卡夫卡之前就已经死亡了。现在,如果重新启动使用者C1,它将再次读取相同的消息,因为它尚未提交这些消息

    这称为“至少一次”交付语义,不同于启用了例如auto.commit的“最多一次”语义。我猜您正在分布式系统中寻找“圣杯”,即“一次语义”:


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

    IIUC:1。如果两个消费者同时失去连接,他们将被重新分配,并可能以这种方式结束2。从编程的角度来说,如果你有一个奇怪的分区程序可以做到这一点。@daniu那么我可以想象以下情况:C1从P1读取一些消息而不提交偏移量。然后它失去了与卡夫卡的连接,并成功地处理了消息。同时,另一消费者C3被创建并分配给读取相同消息的P1。这可能是个问题。。。