Как обрабатывать только одно сообщение данного типа за раз? - PullRequest
0 голосов
/ 29 июня 2018

У меня есть несколько производителей, которые производят запросы на обработку компонентов. Этих компонентов много, и обработка каждого из них занимает значительное время.

Проблема заключается в том, что на один компонент может работать не более одной задачи обработки за раз. Другими словами, никакие две задачи не могут работать одновременно на одном компоненте, но разные компоненты могут (и должны) обрабатываться параллельно.

Моя идея состояла в том, чтобы создать отдельную очередь для каждого компонента и сделать так, чтобы все работники подписывались на все эти очереди. Посредник сообщений будет отправлять только одно сообщение из любой очереди и ожидать ACK. Таким образом, я буду уверен, что несколько компонентов могут обрабатываться одновременно, но для данного компонента будет выполняться только одна задача.

Мой вопрос: это возможно? И если да - это вообще хороший подход? Может быть, есть другое решение этой проблемы?

Вот схема моего подхода:

+----------+              +-------------+
| producer | -----------> |  Exchange   |
+----------+              +-------------+
                           |     |     |
                           v     v     v
                          +-+   +-+   +-+
                          |-|   |-|   |-|
                          |-|   |-|   |-|  Queues per component
                          |-|   |-|   |-|
                          +-+   +-+   +-+
                           |     |     |
                           +-----+-----+
                          /             \
                         v               v
                  +------------+   +------------+
                  | Consumer 1 |   | Consumer 2 |
                  +------------+   +------------+

Редактировать - Можно ли решить только одну очередь? Идея с отдельными очередями на компонент звучит хорошо до тех пор, пока не будет учтено количество компонентов (в основном неограниченных).

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Вместо того, чтобы думать о компонентах как об очередях, думайте о них как о темах. Когда работник хочет прослушивать определенные компоненты, он может создать исключительную очередь, которая связана с вашим обменом темами на основе темы (это будет имя компонента или другой уникальный идентификатор).

Вы должны знать, что сообщения, опубликованные в теме без потребителей, будут отбрасываться, поэтому учитывайте это с помощью флага mandatory или используйте Alternate Exchange


Команда RabbitMQ отслеживает список рассылки rabbitmq-users и только иногда отвечает на вопросы о StackOverflow.

0 голосов
/ 29 июня 2018

Возможно (и хорошая идея, IMO) использовать очередь для каждого компонента. Я не думаю, что это будет работать хорошо для одной очереди (ваш отредактированный вопрос).

Дьявол кроется в деталях, и они зависят от того, какую систему очередей вы используете.

...