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

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

Потребители и предвыборка

Очередь передаёт доставки своим потребителям, каждому в пределах окна неподтверждённых доставок, которое освобождают подтверждения.

Очередь передаёт доставки двум потребителям с окном предвыборки 2; ack освобождает слот, а закрытый канал возвращает свои доставкиОчередь ordersсообщения ждут по порядкуПотребитель 1предвыборка 2:2 не подтвержденыПотребитель 2предвыборка 2:2 не подтвержденыbasic.ack освобождаетслот, и очередьпередаёт следующуюдоставкуКанал закрыт:его неподтверждённыедоставки возвращаютсяс пометкой redeliveredОчередь раздаёт доставки потребителям по очередии пропускает потребителя с заполненным окном
Схема текстом
  1. Очередь orders сообщения ждут по порядку → Потребитель 1 предвыборка 2: 2 не подтверждены: basic.deliver
  2. Очередь orders сообщения ждут по порядку → Потребитель 2 предвыборка 2: 2 не подтверждены: basic.deliver
  3. Потребитель 1 предвыборка 2: 2 не подтверждены → basic.ack освобождает слот, и очередь передаёт следующую доставку
  4. Потребитель 2 предвыборка 2: 2 не подтверждены → Канал закрыт: его неподтверждённые доставки возвращаются с пометкой redelivered
  5. Очередь раздаёт доставки потребителям по очереди и пропускает потребителя с заполненным окном

Потребитель не запрашивает сообщения. Он регистрируется командой basic.consume, и очередь сама отправляет ему кадры basic.deliver. Несколько потребителей одной очереди конкурируют: очередь отдаёт каждое сообщение одному из них, по очереди.

Окно предвыборки - это число доставок, которые потребитель может держать неподтверждёнными. Когда окно заполнено, очередь ничего больше не передаёт этому потребителю, пока подтверждение не освободит слот. Так медленный обработчик замедляет очередь, а не заполняет память сервиса. RabbitMQ задаёт окно командой basic.qos для каждого потребителя, и 0 означает отсутствие предела.

Доставка принадлежит потребителю, пока он её не подтвердит или не отклонит. basic.ack удаляет сообщение из очереди. basic.reject с requeue возвращает его в очередь, а без requeue очередь отбрасывает сообщение или переносит его в очередь недоставленных сообщений. Если канал закрывается с неподтверждёнными доставками, очередь забирает их обратно, и повторная доставка приходит с установленным флагом redelivered.

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

Каждая подписка открывает собственный канал и одного потребителя в нём. До запуска потребителя подписка отправляет basic.qos со своим окном: RabbitQueue::prefetch для одной очереди или LapinBroker::prefetch для каждой подписки, которая не задала своё. Значение - ненулевое число, поэтому подписка, не задавшая ни того ни другого, не отправляет basic.qos и работает без предела.

Окно ограничивает и пакет. В AMQP нет кадра для пакета, поэтому пакет обработчика пакетов собирается на клиенте из того, что очередь уже передала: до размера, заданного в точке монтирования, или из того, что пришло за batch_wait (по умолчанию 50 миллисекунд). Окно меньше размера пакета ограничивает пакет размером окна.

Удалённая подписка закрывает свой канал, и RabbitMQ возвращает в очередь всё, что она держала неподтверждённым. Как рантайм подтверждает каждую доставку, показывает страница Подтверждение и переобработка.

Правила протокола задаёт RabbitMQ (предвыборка потребителя, подтверждения потребителя, очереди задач).