【问题标题】:Kafka: weight-based load balanced consumersKafka:基于权重的负载均衡消费者
【发布时间】:2016-05-06 01:55:50
【问题描述】:

我对 Kafka 还很陌生,与 RabbitMQ(我之前使用的消息代理)相比,它提供的低级 API 让我感到不知所措。我要解决的问题如下:

我有 3 个主题:

  • 主题 1:权重为 10%
  • 主题 2:权重为 40%
  • 主题 3:权重为 50%

这 3 个主题充满了我必须处理的消息。工作人员阅读消息,进行一些处理并继续使用 HTTP POST 发送,该 HTTP POST 具有为所有 3 个主题共享的带宽限制。

我需要什么:

如果队列 2 和 3 为空,则处理后 100% 的可用带宽应进入队列 1 - 如果多个队列上有消息,则应使用活动队列之间分配的“权重”分配可用带宽。

目前,除了“权重”分布(现在,它们以循环方式分布)之外,一切都在工作。优先级不是一个选项,因为在使用优先级时,较高优先级的消息将始终在较低优先级的消息之前传递。

卡夫卡有这样的选择吗?在 RabbitMQ 中,我已经解决了为每个队列分配不同的预取值

【问题讨论】:

  • 我认为 Kafka 爱好者不喜欢“队列”这个词,而是谈论日志。实际上,它混淆了您的问题的含义:当您说“队列”时,您是指主题还是分区?
  • 我认为正确的 Kafka 术语应该是“主题”。重构我的 RabbitMQ 代码后,我继续使用上一个术语,但我会更新问题以更准确。

标签: apache-kafka apache-zookeeper


【解决方案1】:

就我目前所知的 Kafka 而言,这不可能完全符合您的要求。让我们把一些事实记录下来:

  1. 主题可以分区。
  2. 一个分区只能由一个消费者处理。没有两个消费者可以处理同一个分区。 (这确保了两条消息具有相同键的消息排序。)

结论:为主题获得更多 CPU 能力的唯一方法是拥有更多分区和相应数量的消费者。

您可以根据自己的权重设置分区数量:

  • 主题 1:2 个分区
  • 主题 2:8 个分区
  • 主题 3:10 个分区

有多少消费者?使用 10 个消费者,0...9,并让他们订阅主题如下:

  • 主题 1:消费者 0 和 1
  • 主题 2:消费者 2 到 9
  • 主题 3:所有消费者

现在每个消费者必须处理两个主题,当所有主题都有数据时,消费者比率反映了您请求的 5:4:1。当前两个主题枯竭时,仍然有 10 位消费者根据需要在主题 3 上工作。

【讨论】:

  • 我正在尝试实现这个;我想这就是我需要的。但是我仍然很好奇您为什么选择以这种方式分配消费者:将 1 个工作人员分配给主题 1、4 分配给主题 2 和 5 分配给主题 3 不是更合乎逻辑吗?我知道有几个工人总是会提高消息率,但由于他们是有限的而且限制很重,我很确定 1 个工人足以处理 100% 的速率。还有其他理由像您建议的那样划分工人吗?
猜你喜欢
  • 2015-10-11
  • 2021-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-15
  • 2021-02-05
  • 2021-05-20
相关资源
最近更新 更多