我如何扩展Kafka消费者?

Gre*_*reg 9 apache-kafka

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

但请注意,消费者组中的消费者实例不能超过分区.

嗯.我该如何自动缩放?

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

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

在此输入图像描述

如果我理解Kafka模型,我不能在一个消费者群体中为每个分区提供> 1个消费者,因此该图片对Kafka不起作用,对吧?

好的,那么> 1个这样的消费群体怎么样:

在此输入图像描述

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

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

vin*_*ins 12

主题由分区组成。分区决定了一个组中可以拥有的最大消费者数量。 在此处输入图片说明

在上图中,我们只有一个消费者。它可以读取来自所有分区的所有消息。当您增加组中的消费者数量时,会发生分区重新分配,而不是消费者 1 读取来自所有分区的所有消息,消费者 2 可以与消费者 1 分担部分负载,如下所示。 在此处输入图片说明 如果我的消费者数量多于分区数量,会发生什么?每个消费者将被分配 1 个分区。除非您增加主题的分区数,否则组中的任何其他使用者都将处于空闲状态。

在此处输入图片说明

因此,我们需要相应地选择分区。这决定了组中消费者的最大数量。真的不建议更改现有主题的分区,因为它可能会导致问题。也就是说,让我们假设生产者将名称生成到我们有 3 个分区的主题中。所有以 AI 开头的名字都在分区 1,分区 2 中的 JR 和分区 3 中的 SZ。假设我们已经产生了 100 万条消息。现在,如果您突然将分区数从 3 增加到 5,它现在将创建一个不同的 AZ 范围。即分区1的AF,分区2的GK,分区3的LQ,分区4的RU和分区5的VZ,你明白了吗?它有点影响我们之前收到的消息的顺序!所以你需要意识到这一点。如果这可能是个问题,


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


Mar*_*aci 9

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

您可以随时增加分区数(和/或添加额外的代理),但最好已经完成了,这样您就可以只增加线程数并完成它(这些情况通常需要快速响应,所以你应该做所有的准备。你可以提前做)。


Dav*_*fin 7

只需为 hi 和 lo 创建一堆分区。12 是个好数字。60 也是如此。只需选择与您想要的最大并行化数量相匹配的多个分区即可。

说实话,虽然我个人做msg.himsg.lo不同主题的全部,这不是一个要求-你可以做定制parititoning在分区之间鸿沟的消息。