У меня есть требование обновить нашу инфраструктуру производителя/потребителя.
Текущая установка выглядит так:
- Набор из 3 очередей с разным приоритетом (низкий, средний, высокий).
- When one our customers generate a task (i.e Process an image):
- The Producer add the message to the relevant queue.
- Один из рабочих обращается к нему.
Проблема с таким подходом заключается в том, что в случае, если клиент создает огромное количество задач, он может занять все доступные слоты в очереди, что потенциально может привести к отказу в обслуживании (или огромной задержке) в этой очереди.
Предлагаемые изменения:
- У каждого клиента (или группы) должен быть выделенный Потребитель (или группа).
- Когда Потребители простаивают, они должны обрабатывать сообщения других клиентов.
Например, у нас есть набор сообщений:
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), — это использование федеративных очередей и сформировать полный двунаправленный граф (каждая очередь предшествует всем другим очередям и наоборот).