У меня есть несколько производителей, которые производят запросы на обработку компонентов. Этих компонентов много, и обработка каждого из них занимает значительное время.
Проблема заключается в том, что на один компонент может работать не более одной задачи обработки за раз. Другими словами, никакие две задачи не могут работать одновременно на одном компоненте, но разные компоненты могут (и должны) обрабатываться параллельно.
Моя идея состояла в том, чтобы создать отдельную очередь для каждого компонента и сделать так, чтобы все работники подписывались на все эти очереди. Посредник сообщений будет отправлять только одно сообщение из любой очереди и ожидать ACK. Таким образом, я буду уверен, что несколько компонентов могут обрабатываться одновременно, но для данного компонента будет выполняться только одна задача.
Мой вопрос: это возможно? И если да - это вообще хороший подход? Может быть, есть другое решение этой проблемы?
Вот схема моего подхода:
+----------+ +-------------+
| producer | -----------> | Exchange |
+----------+ +-------------+
| | |
v v v
+-+ +-+ +-+
|-| |-| |-|
|-| |-| |-| Queues per component
|-| |-| |-|
+-+ +-+ +-+
| | |
+-----+-----+
/ \
v v
+------------+ +------------+
| Consumer 1 | | Consumer 2 |
+------------+ +------------+
Редактировать - Можно ли решить только одну очередь? Идея с отдельными очередями на компонент звучит хорошо до тех пор, пока не будет учтено количество компонентов (в основном неограниченных).