Parallel processing 在Kafka消费者中实现并发

Parallel processing 在Kafka消费者中实现并发,parallel-processing,apache-kafka,kafka-consumer-api,consumer,Parallel Processing,Apache Kafka,Kafka Consumer Api,Consumer,我们正致力于并行化我们的Kafka消费者,以处理更多的记录来处理峰值负载。我们已经在做的一种方法是,在同一消费群体中,通过旋转尽可能多的消费者和多个分区 我们的消费者需要进行一个API调用,该调用到目前为止是同步的。我们觉得让这个API调用异步将使我们的消费者处理更多的负载。因此,我们试图使API调用异步,并在其响应中增加偏移量。然而,我们发现了一个问题: 通过使API调用异步,我们可以首先得到最后一条记录的响应,而之前记录的API调用都没有启动或完成。如果我们在收到最后一条记录的响应后立即提交

我们正致力于并行化我们的Kafka消费者,以处理更多的记录来处理峰值负载。我们已经在做的一种方法是,在同一消费群体中,通过旋转尽可能多的消费者和多个分区

我们的消费者需要进行一个API调用,该调用到目前为止是同步的。我们觉得让这个API调用异步将使我们的消费者处理更多的负载。因此,我们试图使API调用异步,并在其响应中增加偏移量。然而,我们发现了一个问题:

通过使API调用异步,我们可以首先得到最后一条记录的响应,而之前记录的API调用都没有启动或完成。如果我们在收到最后一条记录的响应后立即提交偏移量,那么偏移量将更改为最后一条记录。同时,如果使用者重新启动或分区重新平衡,我们将不会在提交偏移量为的最后一条记录之前收到任何记录。这样,我们将丢失未处理的记录


到目前为止,我们已经有25个分区。我们期待了解是否有人在不增加分区的情况下实现了并行性,或者增加分区是实现并行性的唯一方法(以避免偏移问题)。

首先,您需要将消息读取与这些消息的处理分离(如果只是一开始)。接下来看看您可以对API进行多少并发调用,因为无论异步与否,调用它的频率超过服务器可以处理的频率都没有任何意义。如果并发API调用的数量大致等于主题中的分区数量,那么异步调用API是没有意义的

如果分区的数量明显小于可能并发API调用的最大数量,那么您有几个选择。您可以按照您的建议,通过异步调用API的线程,尝试以较少的线程(每个使用者一个)进行最大数量的并发API调用,也可以创建更多线程并同步进行调用。当然,接下来你会遇到这样的问题:你的消费者如何将他们的工作交给更多的共享线程,但这正是Flink或Storm等流媒体执行平台为你所做的。提供检查点处理的流式平台(如Flink)也可以解决在消息处理无序时如何处理偏移提交的问题。您可以运行自己的检查点处理和共享线程管理,但您必须真正避免使用流执行平台

最后,您可能有比最大可能并发API调用更多的使用者,但我建议您只有更少的使用者和共享分区,而不是API调用线程

当然,您可以随时更改主题分区的数量,以使上述首选选项更加可行


无论如何,要回答您的特定问题,您需要了解Flink是如何使用Kafka offset提交进行检查点处理的。为了过分简化(因为我认为您不想自己滚动),卡夫卡消费者不仅要记住他们刚刚提交的偏移量,还要记住以前提交的偏移量,这定义了一个流经应用程序的消息块。要么整个消息块都在处理中,要么需要将每个线程的处理状态回滚到上一个块中最后一条消息的处理点。再一次,这是一个严重的过于简单化,但它是这样做的

您必须查看卡夫卡
批处理
处理。简而言之:您可以使用少量(甚至单个)的
分区来设置庞大的
批处理.size
。就目前而言,在
消费者
端(即在ram内存中)消费的
消息的整个
批次
——您可以以任何方式并行化这些消息

我真的很想分享链接,但它们的数量却超出了网络的范围

更新

就提交偏移量而言,您可以对整个
批处理
执行此操作。
一般来说,kafka不能通过滥用分区数来达到目标性能要求,而是依赖于批处理


我已经看到了很多项目,它们都受到分区扩展的影响(稍后您可能会看到问题,例如在重新平衡过程中)。经验法则-首先查看每个可用的
设置。

您没有提供足够的信息,您已经提供了记录似乎依赖于先处理的前一条记录的事实,您需要解释数据结构以及为什么它依赖于前一条记录,从松散的声音来看,您需要一起处理这些记录,或者创建一个同步该过程的机制。目前的问题太广泛了