2017-06-16 160 views
1

我正在为我们的应用程序实施基于卡夫卡的解决方案。 根据Kafka文档,我了解的是消费者组中的一个消费者(它是一个线程)内部映射到订阅主题中的一个分区。卡夫卡:多个实例中的单一消费群体

比方说,我有一个主题与40个分区,我有一个高级消费者运行在4个实例。我不希望一个实例消耗另一个实例消耗的相同消息。但是如果有一个实例出现故障,其他三个实例应该能够处理所有消息。

  • 我应该去同一个消费者组,每个实例有10个线程吗? - 说#2实例之间相同的消费群体作为传统的同步队列机制

In Apache Kafka why can't there be more consumer instances than partitions?

  • 或者我应该去为每个实例不同的消费群?

使用简单的消费或低层次的消费使控制的分区,但这时如果一个实例出现故障时,其他三个实例不会处理从一审消耗的分区

回答

3

首先解释消费者&消费群体的概念,

消费者提供了消费群体的名字标榜自己,并发布到一个话题每个记录每个订阅内交付给一个消费者实例消费群体。

记录将在消费群中的消费者实例上有效地进行负载平衡。如果所有消费者实例具有不同的消费者组,则每条记录都将广播给所有消费者进程。

卡夫卡实现的方式是将日志中的分区分配给消费者实例,以便每个实例在任何时间点都是“公平分享”分区的唯一消费者。如果新实例加入该组,则他们将接管来自该组的其他成员的一些分区;如果一个实例死亡,其分区将分配给其余实例。

现在回答你的问题,

1.我不想一个实例来消费由另一个实例消耗相同的消息。但是如果有一个实例出现故障,其他三个实例应该能够处理所有消息。

这在Kafka架构中默认是可能的。您只需使用相同的使用者组名称标记所有4个实例。

2.我应该去每个实例有10个线程的同一个消费群体吗?

这样做会为每个线程分配一个kafka分区,以便从中分配数据,这是最优的。减少线程数量将负载平衡消费者实例之间的记录分布,并可以重载一些消费者实例。

3.在Apache Kafka为什么不能有比分区更多的消费者实例?

在Kafka中,分区只能分配给一个消费者实例。因此,创建比分区更多的消费者实例会导致闲置的消费者不会消费来自卡夫卡的任何记录。

4.我应该去每个实例的不同消费群体吗?

不会。这会导致记录重复,因为每条记录都将发送到所有实例,因为它们来自不同的消费群。

希望这可以澄清你的疑惑。

+0

感谢您的解释。所以我认为我应该为我的用例选择第一个选项。如果分区增加,我们最终应该增加消费者线程的数量 – Sudharsan

+0

是的。但试着确保你的消费者线程不超过第3点所述的分区。 –

+0

@DaniccanVP根据答案#1,是否有可能让多个消费者以序列化的方式处理消息。即如果一个消息正在被一个实例处理,另一个消息应该等待。这是高可用性原因所必需的。 – TechEnthusiast

0

有几件事情的消息在设计卡夫卡回声系统时需要注意:

  1. 消费者本质上是一个线程,您不希望多线程试图更改您的偏移量标记。这就是为什么消费者体系应该被设计成一个消费者一线的原因。

  2. 抵消提交,在您想要执行抵消提交的频率之间存在微妙的平衡。如果频率较高,则会对系统性能产生不利影响(Zk将成为瓶颈)。如果频率是两个低,那么您可能会冒重复的信息。

0

在卡夫卡你有两种方式做竞争,消费者和发布 - 订阅模式:

  • 竞争消费者:它可能把消费者同样的消​​费群体里面。这样每个分区只能由一个消费者访问(当然,消费者可以阅读多个分区)。这意味着消费者群中的分区数不会超过消费者数量,因为其他消费者在未分配任何分区的情况下将处于空闲状态。当然,如果消费者群体中的一位消费者出现故障,那么闲置的消费者中的一位将进入该分区。
  • 发布订阅:如果您拥有不同的消费者群体,则不同消费群体中的所有消费者都会收到相同的消息。在消费者群体内部,上述模式将被应用。