Kafka 消息传递语义

Kafka message delivery semantic

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

Our topic is divided into a set of totally ordered partitions, each of which is consumed by exactly one consumer within each subscribing consumer group at any given time. This means that the position of a consumer in each partition is just a single integer, the offset of the next message to consume.

我对写法的解读如下:

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


考虑以下情况:

由 2 个消费者 C1C2 组成的消费者组 GRP 从由 2 个分区 P1 和 [=] 组成的主题 TPC 中读取数据15=].

问题: 如果在某个时候 C1P1 读取并且 C2P2 读取,它可以重新平衡吗这样 C1P2 开始读取,C2P1 开始读取。如果是这样,在什么情况下可能会发生?

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

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

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

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

消费者再平衡在

时启动
  • 一个Consumer离开了Consumer组(要么没有及时发送心跳,要么明确请求离开)

  • 一个新的消费者加入消费者组

  • 消费者更改其主题订阅

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

[来源:Confluent Kafka Developer 培训 Material]

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

  1. 你的评论“C1 在没有提交偏移量的情况下从 P1 读取了一些消息。然后它失去了与 Kafka 的连接并成功处理了消息。同时创建了另一个消费者 C3 并将其分配给读取相同消息的 P1 ."

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

这称为“at-least-once”传递语义,与“at-most-once”语义不同,例如auto.commit 启用。我猜您正在寻找分布式系统中的“圣杯”,即“exactly-once-semantics”:)

为此,您需要考虑从 Kafka 到应用程序接收器的整个应用程序。如果您的应用程序的输出不是幂等的,您可能无法实现 exactly-once 语义 (EOS)。但是如果你的输出下沉例如又是Kafka你居然可以实现EOS