我正在为我们的应用程序实现基于Kafka的解决方案。 根据Kafka文档,我理解的是消费者组中的一个消费者(这是一个线程)在内部映射到订阅主题中的一个分区。
假设我有一个包含40个分区的主题,并且我有一个高级别的消费者在4个实例中运行。我不希望一个实例使用另一个实例消耗的相同消息。但是如果一个实例发生故障,其他三个实例应该能够处理所有消息。
In Apache Kafka why can't there be more consumer instances than partitions?
使用简单的使用者或低级别的使用者可以控制分区,但是如果一个实例关闭,其他三个实例将不会处理来自第一个实例中使用的分区的消息
答案 0 :(得分:7)
首先解释消费者和消费者的概念。消费者群体,
消费者使用消费者组名称标记自己,发布到主题的每条记录都会传递到每个订阅消费者组中的一个消费者实例。
记录将在消费者组中的消费者实例上有效地进行负载平衡。如果所有消费者实例具有不同的消费者组,则每个记录将广播到所有消费者进程。
在Kafka中实现消费的方式是通过在消费者实例上划分日志中的分区,以便每个实例都是"公平份额的唯一消费者。在任何时间点的分区。如果新实例加入该组,他们将从该组的其他成员接管一些分区;如果实例死亡,其分区将分发给其余实例。
现在回答你的问题,
<强> 1。我不希望一个实例使用另一个实例消耗的相同消息。但是如果一个实例发生故障,其他三个实例应该能够处理所有消息。
默认情况下,这在Kafka架构中是可行的。您只需使用相同的使用者组名称标记所有4个实例。
<强> 2。我应该为每个实例使用10个线程的同一个消费者群体吗?
这样做会为每个线程分配一个kafka分区,它将从中消耗数据,这是最佳的。减少线程数将负载平衡消费者实例之间的记录分布,并且可能会使某些消费者实例超载。
第3。在Apache Kafka中,为什么不能有比分区更多的消费者实例?
在Kafka中,分区只能分配给一个消费者实例。因此,创建比分区更多的消费者实例将导致闲置的消费者不会消费来自kafka的任何记录。
<强> 4。我应该为每个实例选择不同的消费者群体吗?
没有。这将导致记录重复,因为每条记录都将发送到所有实例,因为它们来自不同的消费者群体。
希望这能澄清你的疑虑。
答案 1 :(得分:0)
设计Kafka回声系统时几乎没有注意事项:
消费者本质上是一个线程,您不希望多个线程尝试更改您的偏移标记。这就是消费者系统应该被设计为一个消费者一个线程的原因。
偏移提交,您希望执行偏移提交的频率之间存在微妙的平衡。如果频率较高则会对系统性能产生负面影响(Zk将成为瓶颈)。如果频率为2,那么您可能会冒重复消息的风险。
答案 2 :(得分:0)
在Kafka中,您可以通过两种方式进行竞争 - 消费者和发布 - 订阅模式: