Перейти к основному содержимому
Нормативная версия документации - английская

Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.

Direct reply-to

Direct reply-to отправляет ответ прямо в канал запрашивающей стороны, без очереди ответов и не более одного раза.

Запрос через direct reply-to: запрос проходит через обычную очередь, а ответ возвращается прямо в канал запрашивающей стороныКанал запрашивающей стороны читаетamq.rabbitmq.reply-to без подтвержденийЗапрос опубликован в этом каналес reply-to и correlation-idОчередь запросовобычная очередьОбработчик-ответчикDirectReplyTo на его ответеОтвет в обменник по умолчаниюключ маршрутизации = полученный reply-toКанал запрашивающей стороныполучает его, без очереди между нимиЗапрос завершаетсяпо своему correlation-idОтветы существуют только в канале запрашивающей стороны:ответ, отправленный после закрытия канала, теряется
Схема текстом
  1. Канал запрашивающей стороны читает amq.rabbitmq.reply-to без подтверждений → Запрос опубликован в этом канале с reply-to и correlation-id
  2. Запрос опубликован в этом канале с reply-to и correlation-id → Очередь запросов обычная очередь
  3. Очередь запросов обычная очередь → Обработчик-ответчик DirectReplyTo на его ответе
  4. Обработчик-ответчик DirectReplyTo на его ответе → Ответ в обменник по умолчанию ключ маршрутизации = полученный reply-to
  5. Ответ в обменник по умолчанию ключ маршрутизации = полученный reply-to → Канал запрашивающей стороны получает его, без очереди между ними
  6. Канал запрашивающей стороны получает его, без очереди между ними → Запрос завершается по своему correlation-id
  7. Ответы существуют только в канале запрашивающей стороны: ответ, отправленный после закрытия канала, теряется

Запрашивающая сторона читает псевдоочередь amq.rabbitmq.reply-to в режиме без подтверждений. Объявлять её не нужно. Запрос, опубликованный в том же канале со свойством reply-to, равным этому имени, получает личный адрес: RabbitMQ заменяет значение свойства на amq.rabbitmq.reply-to. с собственным суффиксом.

Запрос проходит как любое сообщение: через обменник в очередь и к потребителю. Отвечающая сторона публикует ответ в обменник по умолчанию, используя полученный reply-to как ключ маршрутизации. RabbitMQ передаёт ответ прямо в канал запрашивающей стороны. Никакая очередь его не хранит.

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

В этом крейте​

LapinRequester при первом запросе открывает собственный канал, запускает в нём потребителя ответов и публикует в этом канале каждый запрос. Каждый запрос содержит сгенерированный correlation-id, и ответ с тем же идентификатором завершает вызов. Ответы читает одна задача на каждую запрашивающую сторону, на рантайме, на котором подключился брокер. Ошибка канала закрывает канал, и ответы, которые ещё не пришли, теряются; следующий запрос открывает новый канал. Запрос, ответ на который так и не пришёл, завершает тайм-аут этого запроса.

По умолчанию запросы непостоянные: запросу, которого после тайм-аута никто не ждёт, незачем переживать перезапуск сервера. LapinRequest::persistent включает постоянство.

Отвечающая сторона - обычный обработчик с ответом. DirectReplyTo, подключённый как преобразование его ответа, отправляет каждый ответ по адресу, который назвал запрос, и повторяет его correlation-id. Ответ приходит потребителю без подтверждений, поэтому его подтверждение ничего не делает.

Правила протокола задаёт RabbitMQ (direct reply-to).