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 个消费者 C1
和 C2
组成的消费者组 GRP
从由 2 个分区 P1
和 [=] 组成的主题 TPC
中读取数据15=].
问题: 如果在某个时候 C1
从 P1
读取并且 C2
从 P2
读取,它可以重新平衡吗这样 C1
从 P2
开始读取,C2
从 P1
开始读取。如果是这样,在什么情况下可能会发生?
这与上面的引用并不矛盾。
我在你的问题和评论中看到了一些需要讨论的事情。
您对引用段落的解释是正确的。
问题“如果是这样,在什么条件下可能会发生?”:
是的,这种情况可能会发生。将消费者分配给 TopicPartition 的更改主要是通过重新平衡触发的。在以下情况下将触发消费者再平衡:
消费者再平衡在
时启动
一个Consumer离开了Consumer组(要么没有及时发送心跳,要么明确请求离开)
一个新的消费者加入消费者组
消费者更改其主题订阅
消费者组注意到任何订阅主题的主题元数据发生变化
(例如分区数量的增加)
[来源:Confluent Kafka Developer 培训 Material]
请记住,在重新平衡期间 所有 消费者都暂停了。
- 你的评论“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
我正在阅读 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 个消费者 C1
和 C2
组成的消费者组 GRP
从由 2 个分区 P1
和 [=] 组成的主题 TPC
中读取数据15=].
问题: 如果在某个时候 C1
从 P1
读取并且 C2
从 P2
读取,它可以重新平衡吗这样 C1
从 P2
开始读取,C2
从 P1
开始读取。如果是这样,在什么情况下可能会发生?
这与上面的引用并不矛盾。
我在你的问题和评论中看到了一些需要讨论的事情。
您对引用段落的解释是正确的。
问题“如果是这样,在什么条件下可能会发生?”: 是的,这种情况可能会发生。将消费者分配给 TopicPartition 的更改主要是通过重新平衡触发的。在以下情况下将触发消费者再平衡:
消费者再平衡在
时启动一个Consumer离开了Consumer组(要么没有及时发送心跳,要么明确请求离开)
一个新的消费者加入消费者组
消费者更改其主题订阅
消费者组注意到任何订阅主题的主题元数据发生变化 (例如分区数量的增加)
[来源:Confluent Kafka Developer 培训 Material]
请记住,在重新平衡期间 所有 消费者都暂停了。
- 你的评论“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