Плюсы и минусы синхронного обмена сообщениями RabbitMQ

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


person Macko    schedule 12.10.2017    source источник


Ответы (1)


arrow_upward
9
arrow_downward

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

Однако вы можете получить запрос-ответ, используя асинхронный обмен сообщениями. В RabbitMQ это делается с помощью удаленного вызова процедур (RPC) узор.

Проще говоря, ваш издатель публикует сообщение, но не ждет ответа; тем временем он может продолжать заниматься другими делами. Однако издатель отслеживает это, помещая CorrelationId в сообщение и сохраняя его локально. Сообщение в конечном итоге достигает потребителя, который обрабатывает его и отвечает издателю в другой очереди. Ответ имеет тот же CorrelationId. Когда издатель получает ответ, он может пометить этот конкретный вызов (через CorrelationId) как обработанный.

Если вы хотите, вы также можете делать другие вещи с CorrelatonId, например, тайм-аут для тех сообщений, на которые мы не получили ответа после, например. 30 секунд.

person Gigi    schedule 12.10.2017
comment
Можете ли вы предоставить пример кода для запроса-ответа? - person Macko; 12.10.2017
comment
Вы можете найти его по ссылке, которую я дал. - person Gigi; 12.10.2017