我们的处理服务正在提供UI,API和内部客户端,并正在监听Kafka的命令。很少有API客户端可以在短时间内创建很多生成任务(一个任务是N条消息)。使用Kafka,我们无法控制命令的分发,因为每个命令都到达一个处理实例(即工作程序)使用的分区。因此,在处理API请求时,UI请求可能等待太长时间。
[理想的实现中,无论大小如何,我们都应均匀处理所有任务。处理服务的容量分布在所有活动任务中。而且即使群集负载很重,我们也始终了解到,至少在所有其他任务的处理结束之前,已经到达的新任务将几乎可以立即开始处理。
相反,我们想要一种更像下图的体系结构,在该体系结构中,客户和端点的每个组合都有单独的队列。这种体系结构为我们提供了更好的隔离性,并且能够根据每个客户动态调整吞吐量。在生产者方面
在消费者方面
是否有解决此问题的通用解决方案?使用RabbitMQ或任何其他工具。历史上,我们在项目上使用Kafka,因此,如果有任何使用的方法-很棒,但是我们可以使用任何技术作为解决方案。
一种选择是在kafka中使用自定义分区程序,该程序可以查看分区负载并根据负载平衡任务。如果任务本质上是独立的,并且工作器中没有维护状态存储,则此方法有效。
另一种选择是在客户级别上进行负载平衡。在这种情况下,您可以为一组客户选择一组专用的预定义队列。具有特定ID的客户将获得一组队列服务。不利的一面是某些队列的负载可能小于其他队列。此解决方案类似于网络中的Virtual Output Queuing,