我有一个发布到Kafka服务器的流A和一个从Kafka服务中消费、处理并发布到多个Kafka主题的流B。(包括发布到Kafka),流B以500 ms的速率进行处理和生成(因此,慢10倍)。因此,即使某些记录现在由流A发布,流B有时也要花费高达5分钟的时间来处理,在高负载下(例如,一次处理50k条记录),这不是一种替代方案,几乎是不可接受的。我的问题是:一般来说,这种情况下的最佳做法是什么?处理这种情况的快速方法是什么?这些流是同一个应用程序的一部分。我知道,也许我只是给出了一个大的图景,但我正在寻找一个起点,任何想法都是受欢迎的。
2条答案
按热度按时间g9icjywg1#
Kafka没有反压机制,如果下游消费者的速度慢了,滞后就会加大。
解决这个问题的方法是旋转更多的消费者示例,或者使消费者更强大(可能需要更多的CPU,但这取决于瓶颈是什么)。
这听起来像是在同一个可部署环境中既有上游产品又有下游消费者。为什么不让B直接从A的来源消费呢?
tp5buhyn2#
好吧,在我看来,你需要一个应用逻辑,你试图用技术来解决问题。
如果您可以将生成的事件分组到同一个键下(例如,您有一个ID为111,并且您发送了具有相同键Id的所有CREATE、UPDATE、DELETE事件<->:111),则您可以使用具有多个分区的主题。
通过这种方式,所有使用相同密钥生成的事件都将位于相同的分区中,并保证按顺序处理,通过这种方式,您可以并行处理消费和处理,因此使用10个分区,您可以与生成器一样快。
如果这是不可能的,你必须使用背压机制的Alpakka Kafka Streams和可能是一个Akka State Machine的应用逻辑部分,我解释在下面的blog如何可以做到这一点。