У нас есть два потребителя с привязкой c1 (в php) к exchange 1, очереди 1 и ключу маршрутизации 1; и c2 (в Java) bing для обмена 1, очередь 1 и ключ маршрутизации 2. то есть отличаются только ключи маршрутизации, но обмен и очередь одинаковы.
в php мы делаем связывание следующим образом
$channel->queue_bind($this->queue, $this->exchange, $this->routing1);
в Java, следующее
channel.queueBind(queue, exchange, routing2);
Теперь, когда мы публикуем сообщения, предназначенные для c2, используя ключ маршрутизации 2, мы заметили, что сообщения, полученные c1 и c2 в циклическом порядке, а не только полученные c2.
Все отправители для c1 и c2 находятся в php, а отправитель для c1 делает следующее
$channel->basic_publish($message, $this->exchange, $this->routing1);
И отправитель для c2 делает следующее
$channel->basic_publish($message, $this->exchange, $this->routing2);
Есть ли у нас правильное предположение? Что-то не так с кодом?
[Edit1] в качестве эксперимента мы изменили привязку к отдельным очередям для двух потребителей и издателей. и мы заметили, что сообщения, предназначенные для c2 (q2 и r2), были получены и c2, и c1 … что-то здесь не так.отличаются только ключи маршрутизации, но обмен и очередь одинаковы.
Вы разработали свои очереди и потребителей, чтобы произвести это поведение.
когда RMQ имеет несколько потребителей для очереди, он будет циклически пересылать сообщения из этой очереди всем доступным потребителям. это специально разработано в RMQ — оно позволяет вам масштабировать число потребителей для данной очереди, чтобы вы могли обрабатывать большие объемы сообщений.
если вам нужны C1 и C2 для получения разных сообщений, а не циклических сообщений из Q1 между ними, то C1 и C2 должны иметь разные очереди, на которые они подписаны.
например:
имея отдельные очереди для потребителей, вы гарантируете сообщения, идущие соответствующему потребителю
Других решений пока нет …