如何平衡处理多个同时执行的任务?

问题描述 投票:5回答:2

问题

我们的处理服务正在提供UI,API和内部客户端,并正在监听Kafka的命令。很少有API客户端可以在短时间内创建很多生成任务(一个任务是N条消息)。使用Kafka,我们无法控制命令的分发,因为每个命令都到达一个处理实例(即工作程序)使用的分区。因此,在处理API请求时,UI请求可能等待太长时间。

[理想的实现中,无论大小如何,我们都应均匀处理所有任务。处理服务的容量分布在所有活动任务中。而且即使群集负载很重,我们也始终了解到,至少在所有其他任务的处理结束之前,已经到达的新任务将几乎可以立即开始处理。enter image description here


SOLUTION

相反,我们想要一种更像下图的体系结构,在该体系结构中,客户和端点的每个组合都有单独的队列。这种体系结构为我们提供了更好的隔离性,并且能够根据每个客户动态调整吞吐量。enter image description here在生产者方面

  • 任务来自客户端
  • 立即为此任务创建队列
  • 将所有消息发送到此队列

在消费者方面

  • 在一个过程中,您不断更新队列列表
  • 在其他过程中,您遵循此列表并使用例如来自每个队列的1条消息
  • 规模消费者

问题

是否有解决此问题的通用解决方案?使用RabbitMQ或任何其他工具。历史上,我们在项目上使用Kafka,因此,如果有任何使用的方法-很棒,但是我们可以使用任何技术作为解决方案。

asynchronous apache-kafka parallel-processing rabbitmq concurrent-processing
2个回答
0
投票
动态分配队列很困难。这也可能导致队列数量激增,这可能成为基础架构的负担。同样,某些队列可能为空或负载很少。 RabbitMQ在这里无济于事,它是一个与kafka协议不同的队列。

一种选择是在kafka中使用自定义分区程序,该程序可以查看分区负载并根据负载平衡任务。如果任务本质上是独立的,并且工作器中没有维护状态存储,则此方法有效。

另一种选择是在客户级别上进行负载平衡。在这种情况下,您可以为一组客户选择一组专用的预定义队列。具有特定ID的客户将获得一组队列服务。不利的一面是某些队列的负载可能小于其他队列。此解决方案类似于网络中的Virtual Output Queuing


0
投票
© www.soinside.com 2019 - 2024. All rights reserved.