我如何扩展Kafka消费者?

时间:2016-03-24 15:20:14

标签: apache-kafka

我正在阅读Kafka文档,并注意到以下一行:

  

但请注意,消费者组中的消费者实例不能多于分区。

嗯。我该如何自动缩放呢?

例如,假设我有一个具有hi / lo优先级的消息传递系统,因此我为hi和lo优先级消息创建了消息和分区的主题。

如果这是RabbitMQ,我会为每个分区分配一个可自动扩展的消费者群组,如下所示:

enter image description here

如果我理解Kafka模型,我在消费者群体中每个分区不能有1个消费者,那么这张照片对Kafka不起作用,对吧?

好的,那么>这样的1个消费者群体呢?

enter image description here

了解Kafka的限制但是...如果我理解这是如何工作的,那么两个消费者群体都会从一个分区(例如msg.hi)中拉出他们自己的偏移,这样他们就不会知道关于另一个 - 意味着消息可能会被传递两次!

我如何能够实现我在​​兔子设计中使用Kafka的能力,并且仍然保持"排队"行为(我不想两次发送消息)?我错过了什么?

3 个答案:

答案 0 :(得分:3)

为hi和lo创建一堆分区。 12是一个很好的数字。所以是60.只需选择一些与您想要的最大并行化程度相匹配的分区。

老实说,虽然我个人会让msg.himsg.lo完全不同,但这不是必需的 - 你可以自定义parititoning在分区之间划分消息。

答案 1 :(得分:3)

您对消息被消耗两次的假设是正确的(因为每个组消耗100%来自某个主题的消息) 我同意大卫的观点。此外,我建议您创建比实际需要更多的分区,这将为您提供一些空间,以便在需要时增加组中的线程数。

您以后总是可以增加分区数量(和/或添加其他代理),但是已经完成了这样做很好,这样您就可以增加线程数量并完成它们(那些情况通常需要快速响应,因此您应该提前完成所有准备工作。

答案 2 :(得分:2)

主题由分区组成。分区决定了一个组中可以拥有的最大使用者数。 enter image description here

在上图中,我们只有一个消费者。它可以从所有分区读取所有消息。当您增加组中使用者的数量时,将进行分区重新分配,而不是使用者1从所有分区读取所有消息,使用者2可以与使用者1共享一些负载,如下所示。 enter image description here 如果我的使用者数量多于分区数量,会发生什么情况?每个消费者将被分配1个分区。除非您增加主题的分区数,否则该组中的所有其他使用者将处于闲置状态。

enter image description here

因此,我们需要相应地选择分区。这决定了该组中最大的消费者数量。确实不建议更改现有主题的分区,因为这可能会导致问题。也就是说,让我们假设一个生产者在一个拥有3个分区的主题中产生名字。所有以A-I开头的名称都进入分区1,分区2中的J-R和分区3中的S-Z。我们还假设我们已经产生了100万条消息。现在,如果您突然将分区数从3增加到5,它将立即创建一个不同的A-Z范围。也就是说,分区1中的A-F,分区2中的G-K,分区3中的L-Q,分区4中的R-U和分区5中的V-Z。明白吗?这会影响我们之前收到的消息的顺序!因此,您需要意识到这一点。如果这可能是一个问题,那么我们需要预先选择相应的分区。


更多信息在这里-http://www.vinsguru.com/kafka-scaling-consumers-out-for-a-consumer-group/