我有一个升级我们生产者/消费者基础设施的需求。
当前设置如下:
- 一组具有不同优先级(低、中、高)的队列。
- 当我们的客户生成任务时(如处理图像):
- 生产者将消息添加到相关队列中。
- 其中一个工作进程对其进行处理。
这种方法的问题在于,如果一个客户生成大量任务,则可能会占用队列中所有可用插槽,这可能导致该队列拒绝服务(或巨大的延迟)。
建议的更改:
- 每个客户(或一组客户)应该有专用的消费者(或一组消费者)。
- 当消费者处于空闲状态时,它们应该处理其他客户的消息。
例如,我们有一组消息:
1. Producer: Customer1, Queue: High, Payload: {}, Created: Today 16:00:00
2. Producer: Customer2, Queue: High, Payload: {}, Created: Today 16:00:01
3. Producer: Customer1, Queue: High, Payload: {}, Created: Today 16:00:02
4. Producer: Customer1, Queue: High, Payload: {}, Created: Today 16:00:03
我们有以下消费者:
1. Consumer1: Dedicated for Customer1
2. Consumer2: Dedicated for Customer1
3. Consumer3: Dedicated for Customer2
期望的结果:
1. Consumer1 will address Message#1
2. Consumer2 will address Message#2
3. Consumer3 will address Message#3
4. Message#4 Any of the Consumers can address it, since Consumer1/3 are dedicated to the given Producer and Consumer2 will be idle.
总之,当没有事情可做时,客户应该尽快获得专用的消费者数量(或更多),他的消费者可以消费其他客户的消息。
我正在尝试找出实现这个目标的最佳方法,即使需要从RabbitMQ切换到其他消息代理。
到目前为止,我发现的唯一方法(使用RabbitMQ)是使用联邦队列并形成完整的双向图(每个队列都是所有其他队列的上游,反之亦然)。