2011-05-13 2 views
0

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

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

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

веселит,

ответ

0

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

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

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

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

Смежные вопросы