【问题标题】:Kafka: Single consumer group in multiple instancesKafka:多个实例中的单个消费者组
【发布时间】:2017-11-19 02:57:09
【问题描述】:

我正在为我们的应用程序实施基于 Kafka 的解决方案。 根据 Kafka 文档,我的理解是消费者组(这是一个线程)中的一个消费者在内部映射到订阅主题中的一个分区。

假设我有一个包含 40 个分区的主题,并且我有一个在 4 个实例中运行的高级消费者。我不希望一个实例使用另一个实例使用的相同消息。但是如果一个实例出现故障,其他三个实例应该能够处理所有消息。

  • 我应该选择每个实例有 10 个线程的同一个消费者组吗? - Stackoverflow 表示实例之间的相同消费者组充当传统的同步队列机制

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

  • 或者我应该为每个实例选择不同的消费者组吗?

使用简单的消费者或低级消费者可以控制分区,但如果一个实例出现故障,其他三个实例将不会处理来自第一个实例消费的分区的消息

【问题讨论】:

    标签: java apache-kafka kafka-consumer-api


    【解决方案1】:

    首先解释一下Consumers & Consumer Groups的概念,

    消费者使用消费者组名称标记自己,并且发布到主题的每条记录都会传递到每个订阅消费者组中的一个消费者实例。

    记录将在消费者组中的消费者实例上有效地进行负载平衡。如果所有的消费者实例都有不同的消费者组,那么每条记录都会被广播到所有的消费者进程。

    在 Kafka 中实现消费的方式是将日志中的分区划分为消费者实例,以便每个实例在任何时间点都是“公平份额”分区的独占消费者。如果有新实例加入该组,它们将接管该组其他成员的一些分区;如果一个实例死亡,它的分区将被分配给剩余的实例。

    现在回答你的问题,

    1.我不希望一个实例使用另一个实例使用的相同消息。但是如果一个实例出现故障,其他三个实例应该能够处理所有消息。

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

    2。我应该选择每个实例 10 个线程的同一消费者组吗?

    这样做将为每个线程分配一个 kafka 分区,它将从中消耗数据,这是最佳的。减少线程数将负载平衡消费者实例之间的记录分布,并可能使某些消费者实例过载。

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

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

    4.我应该为每个实例选择不同的消费者群体吗?

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

    希望这能澄清你的疑虑。

    【讨论】:

    • 感谢您的解释。所以我认为我应该为我的用例选择第一个选项。如果分区增加,我们最终应该增加消费者线程的数量
    • 是的。但请尽量确保您的消费者线程不超过第 3 点中解释的分区。
    • @DaniccanVP 根据答案#1,是否可以让多个消费者以序列化的方式处理消息。即,如果一个消息正在由一个实例处理,则另一个应该等待。出于高可用性的原因,这是必需的。
    • @TechEnthusiast 消费者在消费者组中并行消费主题中的分区。但是,消费者将按顺序从其分配的分区中消费消息。希望这能回答您的问题。
    • @DaniccanVP 如果我们不能创建多个分区,因为我们需要对所有消息进行强排序,那么 3 个消费者可以一次处理一个进程的消息吗?
    【解决方案2】:

    在设计你的 Kafka 回显系统时有几点需要注意:

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

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

    【讨论】:

      【解决方案3】:

      在 Kafka 中,您有两种方式来实现竞争消费者和发布订阅模式:

      • 竞争消费者:有可能将消费者放在同一个消费者组中。这样每个分区只能由一个消费者访问(当然消费者可以读取多个分区)。这意味着您不能拥有比消费者组中的分区更多的消费者,因为其他消费者将处于空闲状态而没有分配任何分区。当然,如果消费者组中的一个消费者宕机了,那么其中一个空闲的消费者将占据分区。
      • 发布订阅:如果你有不同的消费者组,不同消费者组的所有消费者都会收到相同的消息。然后在消费者组内部,将应用上述模式。

      【讨论】:

      • 我有一种情况,我想为我的应用程序的每个实例/pod 使用不同的消费者组。我怎样才能真正做到这一点?我的应用程序部署在 Kubernetes 中。如果假设我在 k8s 中增加了副本,那么每个额外的 pod 都应该使用一个新的消费者组来消费。应用程序是用 nodejs 编写的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多