Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Direct reply-to
Direct reply-to отправляет ответ прямо в канал запрашивающей стороны, без очереди ответов и не более одного раза.
Схема текстом
- Канал запрашивающей стороны читает amq.rabbitmq.reply-to без подтверждений → Запрос опубликован в этом канале с reply-to и correlation-id
- Запрос опубликован в этом канале с reply-to и correlation-id → Очередь запросов обычная очередь
- Очередь запросов обычная очередь → Обработчик-ответчик DirectReplyTo на его ответе
- Обработчик-ответчик DirectReplyTo на его ответе → Ответ в обменник по умолчанию ключ маршрутизации = полученный reply-to
- Ответ в обменник по умолчанию ключ маршрутизации = полученный reply-to → Канал запрашивающей стороны получает его, без очереди между ними
- Канал запрашивающей стороны получает его, без очереди между ними → Запрос завершается по своему correlation-id
- Ответы существуют только в канале запрашивающей стороны: ответ, отправленный после закрытия канала, теряется
Запрашивающая сторона читает псевдоочередь 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).