2017-07-18 262 views
0

我在读this SO answer和许多这样的博客。多个消费群体消费者如何在卡夫卡的同一主题上跨越分区工作?

我所知道的:

多的消费者可以运行多个消费者在使用多个消费群ID,并从消费群体只有一个消费者可以从一个分区给定的时间消耗在单个分区上运行。

我的问题是从多的消费群体同一主题消费相关多个消费者

  1. 在多种消费(不同组)的情况下,会发生什么耗时一个主题(最终是同一个分区)?

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

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

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

编辑: “重叠数据”:指两个消费者在同一分区获得相同数据进行操作单独的消费群。

回答

2
  1. 是的,他们得到的数据相同。卡夫卡只在主题分区的提交日志中存储一份数据。如果消费者不在同一组中,那么他们可以使用来自客户的消费者库的获取请求获得相同的数据。每个组成员将获得哪些分区的分配由每个组的主要消费者管理。详细步骤中的整个过程记录在这里https://community.hortonworks.com/articles/72378/understanding-kafka-consumer-partition-assignment.html

  2. 抵消由消费者“管理”,但“存储”在卡夫卡经纪人的特殊__consumer_offsets主题中。

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

+0

感谢您的回复。你能建议如何处理第四个问题吗? –

+0

你能解释一下“重叠数据”的含义吗? –

+0

如果为了提高性能,我决定在一个分区上使用来自不同用户组的两位消费者。那么,如果单独的消费者群体的消费者获得相同的数据如何处理这种数据冗余,并确保每个消息在两个消费者中只处理一次? –

1
  1. 每个消费者组从订阅的主题获取每条消息。
  2. 偏移量按分区存储。例如,假设您有一个包含2个分区的主题和一个由2个消费者组成的名为cg的消费者组。在这种情况下,Kafka为每个消费者分配一个分区。然后,消费者从卡夫卡(例如,消费者'询问'Kafka:“消费者组cg分区1的该主题的偏移量是多少,或者其他消费者的分区2是多少)获取它们被分配到的分区的偏移量。在获得正确的抵消额后,消费者会询问一些卡夫卡经纪人以获取该分区中的下一条消息。

我不完全确定你的意思是重叠数据,你能澄清一点还是举个例子?

+0

如果为了提高性能,我决定在一个分区上使用来自不同消费群的两位消费者。 因此,如果单独的消费者组的消费者获得相同的数据如何处理这种数据冗余,并确保每个消息在两个消费者中只处理一次? –

+0

你不会因使用不同的消费者群体而获得任何性能改善,因为他们都做完全相同的工作。就像Hans Jespersen所说的,如果你需要一个高性能的解决方案,你应该使用一个分区很多的主题,并且有很多消费者(构成一个消费者组)。此外,默认情况下,Kafka至少有一次传递语义,这意味着即使使用单个使用者组,也可能有重复的消息。最近Kafka添加了一次交付功能,请参阅https://kafka.apache.org/documentation/#upgrade_11_exactly_once_semantics – oh54