как мы все знаем, шина сообщений, такая как rabbitMQ, в основном предназначена для асинхронного обмена сообщениями, поэтому стандартный подход состоит в том, чтобы запустить и забыть, как опубликовать что-то на шине, и не беспокоиться о том, кто или когда будет обрабатывать опубликованное сообщение. Но я думаю о последнем разговоре в нашей команде разработчиков о синхронной обработке сообщения: случай будет заключаться в публикации сообщения на служебной шине, и, как издатель, я хочу дождаться, пока какой-либо подписчик обработает сообщение и вернет мне результаты - так это выглядит скорее как модель запрос-ответ. Сейчас я думаю об одном доводе, например, о снижении производительности этой модели. о чем ты думаешь? Когда использовать асинхронность и когда синхронизацию? Каковы компромиссы?
Плюсы и минусы синхронного обмена сообщениями RabbitMQ
Ответы (1)
Синхронный обмен сообщениями возможен, но влияет на масштабируемость. Если издателю приходится ждать ответа своих получателей, то он будет ограничен в том, чего он может достичь в любой момент времени.
Однако вы можете получить запрос-ответ, используя асинхронный обмен сообщениями. В RabbitMQ это делается с помощью удаленного вызова процедур (RPC) узор.
Проще говоря, ваш издатель публикует сообщение, но не ждет ответа; тем временем он может продолжать заниматься другими делами. Однако издатель отслеживает это, помещая CorrelationId в сообщение и сохраняя его локально. Сообщение в конечном итоге достигает потребителя, который обрабатывает его и отвечает издателю в другой очереди. Ответ имеет тот же CorrelationId. Когда издатель получает ответ, он может пометить этот конкретный вызов (через CorrelationId) как обработанный.
Если вы хотите, вы также можете делать другие вещи с CorrelatonId, например, тайм-аут для тех сообщений, на которые мы не получили ответа после, например. 30 секунд.