2015-11-17 1 views
0

Я пытаюсь реализовать систему распределения задач с помощью RabbitMQ. Я начал с чего-то вроде кода из этой статьи: http://deontologician.tumblr.com/post/19741542377/using-pika-to-create-headers-exchanges-with - есть обмен заголовками, и несколько очередей потребителей привязаны к нему с разными значениями заголовка.Передача сообщений только один раз в заголовках заголовков RabbitMQ

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

Таким образом, я могу настроить, например, двух потребителей A a B. A обеспечивает среды «foo» и «bar», а B - только «bar». Теперь, когда задача, для которой требуется «бар» среды, поставляется как для A, так и для B, но я хочу, чтобы она переходила к одному из них (на самом деле это не важно).

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

+0

Можете ли вы показать пример того, как значения заголовка могут отличаться и как вам нужно сообщение, чтобы обратиться к разным потребителям? – kponz

+0

@kponz Я немного расширил вопрос ... – Teyras

+0

Возможно, вы захотите настроить очереди в соответствии с вашими средами, то есть создать очередь 'foo' и' bar', а затем привязать своих потребителей к очереди, в которых они заинтересованы (A привязывается к обоим, B только к 'bar') – kponz

ответ

0

Я могу настроить, например, двух потребителей A a B. A обеспечивает среды «foo» и «bar», а B - только «bar». Теперь, когда задача, для которой требуется «бар» среды, поставляется как для A, так и для B, но я хочу, чтобы она переходила к одному из них (на самом деле это не важно).

с вашей текущей настройкой, то, что вы хотите, будет невозможно. все матчи маршрутизации получат копию сообщения.

Однако вы можете изменить свою конфигурацию, что у вас есть одна очередь «foo» и одиночная очередь «bar». то вы можете иметь несколько потребителей в очереди «foo» и нескольких потребителей в очереди «bar».

В этом случае, когда одно сообщение помещается в «foo», и как потребитель A, так и потребитель B слушают, RabbitMQ доставляет единственное сообщение только одному из этих потребителей.

...

пожалуйста, имейте в виду, что это невозможно 100% гарантия, что одно сообщение будет обрабатываться только один раз. любая ошибка в сетевом или потребительском коде может привести к тому, что сообщение будет возвращено в очередь и обработано снова. из-за этого ваши сообщения/потребители должны использовать idempotence, чтобы гарантировать, что обработка одного и того же сообщения дважды не вызовет проблем.

+2

Да, я не против, если сообщение доставлено дважды в исключительном случае. Я просто не хочу, чтобы он доставлялся каждому потребителю (или терялся). – Teyras