【问题标题】:How to decide the concurrency to be set in spring kafka?如何决定在spring kafka中设置的并发?
【发布时间】:2020-05-17 17:17:34
【问题描述】:

我正在使用 @KafkaListener 注释编写一个 kafka 消费者,我知道有一种方法可以使用 ConcurrentKafkaListenerContainerFactory 中的方法增加来自不同分区的并发 kafka 消费者的数量

e.g. factory.setConcurrency(3);

用于 setconcurrency 的 Javadoc 是这样说的:-

同时运行的 KafkaMessageListenerContainer 的最大数量。来自同一分区内的消息将按顺序处理。

现在我的问题是

我有一个包含 144 个分区的 kafka 主题,我们的应用程序需要向其消费消息,并且应用程序的 3 个实例并行运行。

我想知道如何决定需要设置的并发值

ConcurrentKafkaListenerContainerFactory.setconcurrency (<Value>) 

这样我们可以在消费消息时实现高吞吐量。

我应该使用 144/3 = 48 作为并发因子还是有公式可以得出这个数字?

【问题讨论】:

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


    【解决方案1】:

    是的,您最好的方法是在每个实例中将并发设置为48,以便每个分区将被消费者组中的唯一线程消耗,并且为了实现高吞吐量,您可以使用Batch listenershigher batch size

    另一个最佳选择是运行更多实例,例如 14 个,每个实例的并发级别为 10。在这两种方法中,您还需要考虑每个实例的可用 CPU having over head threads than CPU will not give better performance

    从 1.1 版本开始,您可以配置 @KafkaListener 方法来接收从消费者投票中收到的整批消费者记录。配置监听容器工厂创建批量监听,可以设置batchListener属性

    【讨论】:

    • 请记住,您没有必须每个分区有一个消费者;您需要多少并发取决于许多因素,包括但不限于您的代码、任何同步块、任何下游瓶颈(数据库、网络等)。
    • @GaryRussell 在您开发了 spring kafka 库时,您对我的问题陈述有何建议?
    • @GaryRussell :- 如果假设(试图理解并发)我将并发保持为 1,然后 3 个实例必须连接到所有 142 个分区。这意味着每个实例将连接到 42 个分区,但应用程序线程一次只消耗一条消息,因为并发性为 1。完成一个处理后,将从 42 个分区中提取下一个分区消息,并且消费消息。我的理解正确吗?
    • 不可能提供通用的指导——每个环境都不一样;您需要进行试验以确定适合您情况的最佳设置。如果您无法获得所需的吞吐量,您将需要分析您的应用程序以找出瓶颈所在。是的,如果你有 1 的并发,你一次只能得到一条记录;在从另一个分区获取任何记录之前,您可能会为一个分区获取多条记录。
    • @Deadpool :- 使用具有更高批处理大小(例如 5000)的批处理侦听器不会增加应用程序的堆大小,因为我正在使用所有记录并在我确认它们之前将它们放入内存中。如果我的理解不正确,请纠正我?
    猜你喜欢
    • 2018-10-20
    • 2017-09-21
    • 1970-01-01
    • 2022-01-02
    • 2021-07-25
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 2018-09-05
    相关资源
    最近更新 更多