首页 > 解决方案 > 是否可以在分区数量上扩展消费者任务?

问题描述

我们的消费者存在性能问题。更准确地说,在 WHAT 中对消息做了什么。

通常,我们会得到 2000 行的文件,分成 6000 个 Kafka 事件。

我们的主题 X 配置了 10 个分区。在这种情况下,我们可以在一个给定的组中启动最多 10 个消费者,每个消费者将附加到一个单独的分区,直到重新平衡。顺便提一下,在我们的例子中,分区内消息的顺序是强制性的。

问题是消费者处理每条消息最多需要 6 秒。所以整个文件在大约 1 小时内处理完毕。

我也知道 Kafka 是为可扩展性而设计的,并且这种可扩展性是由主题的分区数量管理的。

(一个明显的解决方案是重构消费者的代码。这是有计划的,但我们开发团队的工作量就是这样,这种重构可能在几周前不会发生。)

向主题添加新分区是一种解决方案,但现有消息不会自动重新分区,我们需要编写一个 KS-app(或其他进程)。这也是可能的。

但我想知道我们是否可以想象另一种解决方案,一种让更多工作人员并行接收更多消息的方法?

除此之外,有人可以解释为什么 Kafka 中使用的策略(即一个消费者长时间连接到专用分区)是正确的解决方案吗?

我的意思是,我们可以想象其他解决方案,消费者多于分区:消费者获取消息,与代理“断开连接”,处理消息,在此期间另一个消费者可以“连接”并从同一分区获取消息,“断开连接”,处理消息,第三个消费者可以连接......(团队中的一个人说“胡。Kafka 不可扩展。我们不能添加更多消费者。”)

标签: apache-kafkakafka-consumer-api

解决方案


是否可以在分区数量上扩展消费者任务?

不。

简而言之,分区是 Kafka 中的规模单位。如果您需要以更高级别的并行处理,那么您需要更多分区。这就是卡夫卡的设计方式。

正如您所提到的,您可以使用 Kafka Streams 等将您的主题重新分区到更多的分区,从而对排序产生相关影响。

您还可以使用KSQL使这更简单:

CREATE STREAM foo_repartitioned \
  WITH (PARTITIONS=256) AS \
SELECT * FROM foo;

“Kafka 不可扩展。我们无法添加更多消费者。”

您可以添加更多消费者。您只需要预先设计具有适当级别的分区的主题;-)


推荐阅读