типы обмена amqp - PullRequest
       26

типы обмена amqp

0 голосов
/ 14 мая 2011

Я вхожу во все аспекты amqp, и у меня есть вопрос относительно того, какой тип обмена использовать в следующих сценариях:

1) мне нужно создать рабочий пул, где каждый работник что-то делает, когда получает сообщение. теперь я хочу, чтобы разные работники были привязаны к разным типам задач; который я могу указать, используя ключи маршрутизации каждого сообщения в моде темы. со стороны потребителя, немного поиграв с комбу, я заметил, что если я укажу то же имя очереди, но с разными ключами маршрутизации, я не смогу «отфильтровать» сообщения. например, если у меня есть один потребитель с '#', а другой с 'foo. #' - оба используют одно и то же имя очереди, последний потребитель будет работать циклически в очереди с бывшим потребителем. это ожидается? я работаю с обоими потребителями на одной машине.

2) с учетом того, что я создаю уникальные имена очереди для каждого потребителя, и на этот раз каждый потребитель получает только то, что я запрашиваю, с помощью ключа маршрутизации. однако, поскольку они представляют собой отдельные очереди, я могу получить задание более чем у одного потребителя. например, если потребитель 1 имеет ключ «#», а потребитель 2 имеет «foo. #»; когда потребитель 2 получает (и подтверждает) сообщение, потребитель 1 также получает то же сообщение. это не то, что я хочу; я хотел бы, чтобы только один потребитель получил только сообщение. Есть ли способ, которым я могу достичь этого без написания «диспетчера задач»?

ура

1 Ответ

0 голосов
/ 20 августа 2011

Для большинства людей лучше всего использовать обмен темами для всего, пока вы полностью не поймете, как работает AMQP. Вы можете получить разветвление и прямое поведение, просто выбрав правильный ключ привязки для очереди. Например, если вы используете «#» для ключа привязки, то эта очередь ведет себя так, как если бы она была подключена к прямому обмену. И если вы связываете две или более очередей с одними и теми же ключами маршрутизации, то эти очереди функционируют так же, как если бы это был разветвленный обмен.

Ожидается круговое поведение. Обе задачи подписаны на одну и ту же очередь. Тот факт, что ключи привязки разные, просто все смущает. Вероятно, кто связывает в последнюю очередь, установит ключ привязки для каждого пользователя очереди. Лучше не делать этого. Я создаю систему, в которой несколько очередей имеют от 4 до 15 экземпляров одного и того же рабочего кода, извлекают сообщения из одной и той же очереди и затем собирают данные из веб-служб. У меня даже были рабочие, работающие на разных процессорах, хотя в итоге это не было необходимо для производительности.

Я не уверен, почему вы используете подстановочные знаки в связывающих ключах. Если у вас есть 8 потребителей с именами от A до H, и каждый из них выполняет свою работу, то почему бы не опубликовать сообщения с ключами маршрутизации work.A через work.H, а затем использовать те же ключи привязки work.A через work.H. Таким образом, если у вас есть несколько экземпляров работника B, все они привязываются к работнику B. и сообщение не доставляется дважды.

Кроме того, если вы не подтвердите сообщение после его обработки, то в конечном итоге оно вернется в очередь и будет доставлено снова. Надеюсь, вы получили ответ после успешной обработки сообщения. Менеджер задач не требуется, просто лучше понять все ручки AMQP.

...