Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Потребители и предвыборка
Очередь передаёт доставки своим потребителям, каждому в пределах окна неподтверждённых доставок, которое освобождают подтверждения.
Схема текстом
- Очередь orders сообщения ждут по порядку → Потребитель 1 предвыборка 2: 2 не подтверждены: basic.deliver
- Очередь orders сообщения ждут по порядку → Потребитель 2 предвыборка 2: 2 не подтверждены: basic.deliver
- Потребитель 1 предвыборка 2: 2 не подтверждены → basic.ack освобождает слот, и очередь передаёт следующую доставку
- Потребитель 2 предвыборка 2: 2 не подтверждены → Канал закрыт: его неподтверждённые доставки возвращаются с пометкой redelivered
- Очередь раздаёт доставки потребителям по очереди и пропускает потребителя с заполненным окном
Потребитель не запрашивает сообщения. Он регистрируется командой 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 (предвыборка потребителя, подтверждения потребителя, очереди задач).