Похоже, вы могли бы использовать одну очередь на пункт назначения для доставки сообщений от разных издателей к шлюзу. В этом случае шлюз должен быть многопоточным, с одним потоком на потребителя очереди. Таким образом, для x числа производителей, публикующих по n адресатам, шлюзу потребуется n потоков, по одному на адресат. Эта архитектура обеспечит вам пропускную способность, которая зависит от того, сколько обработки шлюз должен выполнить с сообщением, прежде чем оно переадресует его в конечный пункт назначения, и сколько времени потребуется для обработки сообщения конечным пунктом назначения до шлюза. Можно отправить следующее сообщение.
У этого дизайна есть 2 недостатка:
- У ваших приложений будет одна точка отказа - шлюз. Вы не сможете сбалансировать его, потому что для вас важен порядок потребления, поэтому вы не хотите, чтобы 2 шлюза истощали одну и ту же очередь.
- Каждая очередь потенциально может стать узким местом, засоряя сообщения, которые обрабатываются недостаточно быстро.
Если у вас есть контроль над издателями, не предпочтете ли вы пересылать сообщения непосредственно от издателей в конечные пункты назначения, используя протокол выбора пунктов назначения, не проходя через шлюз (который, кажется, не служит никакой другой цели, кроме узкое место производительности и единой точки отказа)? Если вам удастся добиться этого, ваша следующая задача - научить конечных пунктов назначения многопроцессным запросам, по возможности ослабив ограничение порядка (требование № 2).
Другой выбор, который у вас есть, - выполнить пакетную обработку. В любой конкретный момент времени потребитель выгружает все доступные сообщения в очереди и обрабатывает их сразу. Это означает, что вам придется выполнять синхронное потребление сообщений (Consumer # receive ()), а не асинхронное потребление с onMessage.