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

时间:2019-03-06 14:04:19

标签: apache-kafka kafka-consumer-api

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

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

我们的主题X配置了10个分区。在这种情况下,我们可以在一个给定的组中启动多达10个使用方,并且每个使用方将附加到一个分区,直到进行重新平衡。只需提一下,在我们的情况下,分区中消息的顺序是强制性的。

问题在于,每条消息最多需要6秒才能被使用者处理。因此,整个文件将在1小时左右的时间内得到处理。

我还知道Kafka是为可伸缩性而设计的,而这种可伸缩性是由一个主题的分区数来管理的。

(一个明显的解决方案是重构使用者的代码。这是计划中的,但是我们开发团队的工作量是原来的,并且这种重构可能要在几周后才能发生。)

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

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

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

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

1 个答案:

答案 0 :(得分:0)

  

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

不。

简单地说,分区是您在Kafka中的规模单位。如果需要以更高的并行度进行处理,则需要更多的分区。这就是Kafka的设计方式。

如前所述,您可以使用Kafka Streams等将您的主题重新划分为更多的分区,从而对订购产生影响。

您还可以使用KSQL来简化此操作:

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

  

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

您可以添加更多消费者。您只需要事先设计适当级别的分区即可;-)