【发布时间】:2017-04-15 05:28:50
【问题描述】:
如果你的消费者少于分区,这是否仅仅意味着你不会消费给定主题的所有消息?
在云环境中,您打算如何跟踪正在运行的消费者数量以及指向给定主题#partition 的消费者数量?
如果您在给定主题#partition 上有多个消费者怎么办?我猜消费者必须以某种方式跟踪它已经处理了哪些消息,以防出现重复?
【问题讨论】:
标签: apache-kafka
如果你的消费者少于分区,这是否仅仅意味着你不会消费给定主题的所有消息?
在云环境中,您打算如何跟踪正在运行的消费者数量以及指向给定主题#partition 的消费者数量?
如果您在给定主题#partition 上有多个消费者怎么办?我猜消费者必须以某种方式跟踪它已经处理了哪些消息,以防出现重复?
【问题讨论】:
标签: apache-kafka
其实每个消费者都属于一个consumer group。当 Kafka 集群向一个消费者组发送数据时,一个分区的所有记录都会发送给该组中的单个消费者。
如果组中的分区数多于消费者,则一些消费者将使用来自多个分区的数据。如果组中的消费者多于分区,则某些消费者将无法获得数据。如果您向组中添加新的消费者实例,它们将接管旧成员的一些分区。如果您从组中删除消费者(或消费者死亡),则其分区将重新分配给其他成员。
现在让我们来看看你的问题:
如果你的消费者少于分区,这是否仅仅意味着你不会消费给定主题的所有消息?
没有。同一消费者组中的一些消费者会消费来自多个分区的数据。
在云环境中,您打算如何跟踪正在运行的消费者数量以及指向给定主题#partition 的消费者数量?
卡夫卡会照顾好它。如果新消费者加入群组,或者老消费者死亡,Kafka 会做 reblance。
如果给定主题#partition 上有多个消费者怎么办?
您不能有多个消费者(在一个消费者组中)来使用来自单个分区的数据。但是,如果有多个消费者组,则每个消费者组中的一个(并且只有一个)消费者可以消费同一个分区。
【讨论】:
1) 不,这意味着您将让一个消费者处理多个消费者。 2) Kafka 从不将同一个分区分配给多个消费者,因为这将违反分区内的顺序保证。 3) 您可以在客户端代码中实现 ConsumerRebalanceListener,每当从消费者那里分配或撤销分区时都会调用该代码。
您可能希望专门查看这篇文章的“将分区分配给消费者”部分。在那我有一个示例,您在其中创建具有 3 个分区的主题,然后使用 ConsumerRebalanceListener 的消费者告诉您哪个消费者正在处理哪个分区。现在你可以通过启动 1 个或多个消费者来玩弄它,看看会发生什么。示例代码在github中
http://www.javaworld.com/article/3066873/big-data/big-data-messaging-with-kafka-part-2.html
【讨论】: