【问题标题】:How multiple consumer group consumers work across partition on the same topic in Kafka?多个消费者组消费者如何跨分区在 Kafka 中的同一主题上工作?
【发布时间】:2017-12-23 19:57:50
【问题描述】:

我正在阅读this SO answer 和许多这样的博客。

我知道的:

当运行具有多个消费者组 ID 的多个消费者时,多个消费者可以在单个分区上运行,并且一个消费者组中只有一个消费者可以在给定时间从一个分区消费。

我的问题与多个消费者群体多个消费者同一主题消费有关:

  1. 如果多个消费者(不同的组)消费一个主题(最终是同一个分区)会发生什么?

  2. 他们得到相同的数据吗?

  3. 如何管理偏移量?是否对每个消费者分开?

  4. (可能基于意见)您或通常推荐的方法是如何处理在单个分区上运行的单独组的两个使用者之间的重叠数据?

编辑: “重叠数据”:指在同一分区上运行的不同消费者组的两个消费者获得相同的数据。

【问题讨论】:

    标签: apache-kafka bigdata


    【解决方案1】:
    1. 每个消费者组都从订阅的主题中获取每条消息。
    2. 是的
    3. 偏移量按分区存储。例如,假设您有一个具有 2 个分区的主题和一个名为 cg 的由 2 个消费者组成的消费者组。在这种情况下,Kafka 为每个消费者分配一个分区。然后消费者从 Kafka 获取分配给他们的分区的偏移量(例如,消费者“询问”Kafka:“消费者组 cg 分区 1 的此主题的偏移量是多少”,或另一个消费者的分区 2)。在获得正确的偏移量后,消费者会轮询一些 Kafka 代理以获取该分区中的下一条消息。

    我不完全确定你所说的重叠数据是什么意思,你能澄清一下或举个例子吗?

    【讨论】:

    • 如果为了提高性能,我决定在一个分区上使用来自不同消费者组的 2 个消费者。那么,如果不同消费者组的消费者获得相同的数据,如何处理这种数据冗余并确保每条消息在两个消费者之间只处理一次?
    • 使用单独的消费者组不会获得任何性能改进,因为它们都做完全相同的工作。就像 Hans Jespersen 所说,如果你需要一个高性能的解决方案,你应该使用一个有很多分区并且有很多消费者(组成一个消费者组)的主题。此外,默认情况下,Kafka 至少具有一次传递语义,这意味着即使使用单个消费者组,您也可能有重复的消息。就在最近,Kafka 增加了只发送一次的功能,请参阅kafka.apache.org/documentation/…
    【解决方案2】:
    1. 是的,他们得到相同的数据。 Kafka 仅在主题分区的提交日志中存储一份数据。如果消费者不在同一个组中,那么他们每个人都可以使用来自客户端消费者库的获取请求来获取相同的数据。每个组成员将获得哪些分区的分配由每个组的主要消费者管理。详细步骤中的整个过程记录在此处https://community.hortonworks.com/articles/72378/understanding-kafka-consumer-partition-assignment.html

    2. 偏移量由消费者“管理”,但“存储”在 Kafka 代理的特殊 __consumer_offsets 主题中。

    3. 为每个 (consumer group, topic, partition) 元组存储偏移量。当向 __consumer_offsets 主题发布偏移量时,此组合也用作键,以便日志压缩可以删除旧的不需要的偏移量提交消息,并且相同 (consumer group, topic, partition) 元组的所有偏移量都存储在 __consumer_offsets 主题的同一分区中(其中默认为 50 个分区)

    【讨论】:

    • 感谢您的回复。你能建议如何处理第四个问题吗?
    • 你能解释一下“重叠数据”是什么意思吗?
    • 如果为了提高性能,我决定在一个分区上使用来自不同消费者组的 2 个消费者。那么,如果不同消费者组的消费者获得相同的数据,如何处理这种数据冗余并确保每条消息在两个消费者之间只处理一次?
    • 如果你想拥有比分区更多的消费者并且仍然有性能增强并且只处理每条消息一次,那么你应该增加主题中的分区数量,以便至少有尽可能多的分区消费者。通常创建主题时需要启动 2 倍的分区,以便以后可以在需要时添加更多消费者,而无需重新分区主题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 2017-10-17
    • 2019-08-27
    • 1970-01-01
    • 2017-01-04
    • 2020-09-19
    • 1970-01-01
    相关资源
    最近更新 更多