Запрос / ответ службы: использовали бы вы ключи маршрутизации и хранили бы сообщения в одной очереди RabbitMQ?

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

В настоящее время я определил очередь для постановки в очередь поисковых запросов и другую очередь для постановки в очередь результатов поиска.

Не могли бы вы реорганизовать это так, чтобы просто помещать в уникальную очередь, где сообщения имеют запрос и ответ ключи маршрутизации? Или это чрезмерное использование RabbitMQ в данном конкретном случае?


person Matías Fidemraizer    schedule 21.11.2016    source источник


Ответы (2)


Похоже, вы хотите использовать шаблон RPC? Чтобы следовать протоколу, вы должны опубликовать ответ на основе ReplyTo или ReplyToAddress из BasicProperties. Таким образом, вызывающая сторона (запрашивающая сторона) решает, где ожидается публикация ответа. На мой взгляд, было бы излишним объявить выделенный обмен для одного типа сообщений. Для повышения производительности вы можете использовать функцию прямого ответа. Существует множество клиентов высокого уровня, которые помогут вам справиться с некоторыми из этих вещей.

person pardahlman    schedule 22.11.2016
comment
Спасибо за Ваш ответ. Это добавляет больше деталей к моему беспокойству. Кстати, я считаю, что мой автоответ лучше подходит для моего домена, потому что мне нужен ACK. Но хорошо знать, что для других случаев есть встроенный подход! - person Matías Fidemraizer; 22.11.2016

После некоторого исследования я считаю, что это должно быть хорошей практикой:

  • Должен быть единый обмен. Например, searchrequest.
  • Две очереди: одна для входящих запросов, а другая для ответов.
  • Весь отдельный обмен должен маршрутизировать сообщение из очереди запросов или ответов на основе заданного ключа маршрутизации.
  • Когда какая-либо служба выполняет поисковые запросы, отправляет сообщение на обмен searchrequest и ключ маршрутизации запроса. Когда служба индексирования поиска создает ответ, она также отправляет его на обмен searchrequest, но публикует ответное сообщение с ключом маршрутизации ответа.

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

person Matías Fidemraizer    schedule 21.11.2016
comment
Посмотрите это от Уди Дахана - person Sean Farmar; 21.11.2016
comment
@SeanFarmar Хорошая статья. Что ж, это не правило (не используйте маршрутизацию ESB), но я знаю, что маршрутизацией можно злоупотреблять. Я считаю, что мой собственный ответ является хорошей практикой, потому что в конце дня вы по-прежнему развертываете две очереди, а exchange действует как пространство имен ESB. Что вы думаете об этом? - person Matías Fidemraizer; 21.11.2016
comment
Я за простоту и разделение каналов. Для меня естественно иметь (в описанном вами сценарии) процессор команд поиска и процессор результатов поиска, после того, как процессор команд поиска завершит свою работу, он отправит команду результата поиска с проиндексированные данные, обработчик результатов поиска будет делать все, что ему нужно для выполнения своей работы ... Имеет смысл? - person Sean Farmar; 23.11.2016