Ale*_*lap 11 parallel-processing asynchronous rabbitmq concurrent-processing apache-kafka
我们的处理服务为 UI、API 和内部客户端提供服务,并监听来自Kafka 的命令。很少有 API 客户端可能会在短时间内创建大量生成任务(一个任务是 N 条消息)。使用 Kafka,我们无法控制命令分发,因为每个命令都来自一个处理实例(又名工作程序)消耗的分区。因此,在处理 API 请求时,UI 请求可能等待太长时间。
在理想的实现中,我们应该均匀地处理所有任务,无论其大小。处理服务的容量分布在所有活动任务中。并且即使集群负载很重,我们总是明白,已经到达的新任务几乎可以立即开始处理,至少在所有其他任务的处理结束之前。
相反,我们想要一个看起来更像下图的架构,其中每个客户和端点的组合都有单独的队列。这种架构为我们提供了更好的隔离,以及基于每个客户动态调整吞吐量的能力。
在生产者方面
在消费者方面
这样的问题有什么通用的解决方案吗?使用 RabbitMQ 或任何其他工具。? 过去,我们在项目中使用 Kafka,所以如果有任何方法使用 - 这太棒了,但我们可以使用任何技术来解决问题。
据我了解这个问题,您希望使用动态分配的队列创建与客户的请求隔离,这将允许每个客户任务独立执行。该问题看起来类似于网络中的队头阻塞问题
动态分配队列是很困难的。这还可能导致队列数量激增,从而给基础设施带来负担。此外,某些队列可能是空的或负载非常少。RabbitMQ 在这里无济于事,它是一个与 kafka 协议不同的队列。
一种替代方法是在 kafka 中使用自定义分区器,它可以查看分区负载并基于该负载平衡任务。如果任务本质上是独立的并且工作线程中没有维护状态存储,那么这种方法就有效。
另一种选择是在客户级别进行负载平衡。在这种情况下,您可以为一组客户选择一组专用的预定义队列。具有特定 ID 的客户将通过一组队列获得服务。这样做的缺点是某些队列的负载可能比其他队列少。该解决方案类似于网络中的虚拟输出队列,
| 归档时间: |
|
| 查看次数: |
193 次 |
| 最近记录: |