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

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

Классические и кворумные очереди

Классическая очередь хранится на одном узле и ничего не считает; кворумная очередь реплицируется, считает неудачные доставки и сама убирает сообщение, исчерпавшее попытки.

Классическая и кворумная очереди рядом: где каждая хранит сообщения, что делает возврат в очередь и что останавливает сообщение, которое возвращается снова и сноваКлассическая очередьКворумная очередьСообщения хранитодин узелreject с requeue:снова в очереди,без счётаreject без requeue:к недоставленнымили отбрасываетсяЛидер и егопоследователи, Raftreject с requeue:снова в очереди,x-delivery-count + 1Предел превышен:к недоставленнымили отбрасываетсяС RabbitMQ 4.0 предел доставок кворумной очередиравен 20, если очередь не задаёт другой
Схема текстом
  1. Классическая очередь: Сообщения хранит один узел; reject с requeue: снова в очереди, без счёта; reject без requeue: к недоставленным или отбрасывается
  2. Кворумная очередь: Лидер и его последователи, Raft; reject с requeue: снова в очереди, x-delivery-count + 1; Предел превышен: к недоставленным или отбрасывается
  3. reject с requeue: снова в очереди, x-delivery-count + 1 → Предел превышен: к недоставленным или отбрасывается: предел превышен
  4. С RabbitMQ 4.0 предел доставок кворумной очереди равен 20, если очередь не задаёт другой

Тип задаётся при объявлении очереди аргументом x-queue-type. Обе очереди принимают одних и тех же потребителей и одни и те же кадры подтверждения. Различаются они тем, где хранятся сообщения и чего сообщению стоит возврат в очередь.

В RabbitMQ 4 классическая очередь хранит сообщения на одном узле, без реплик. Отклонённая с requeue доставка возвращается и может приходить снова без конца. Очередь ничего не считает: у повторной доставки установлен только флаг redelivered.

Кворумная очередь реплицирует сообщения на несколько узлов по протоколу Raft, и каждую запись принимает большинство из них. Она устойчива по определению. Очередь считает неудачные доставки каждого сообщения и ставит счётчик на повторную доставку заголовком x-delivery-count. Сообщение, у которого счётчик превысил предел доставок очереди, покидает очередь. С RabbitMQ 4.0 предел равен 20, если очередь не задаёт свой.

С RabbitMQ 4.3 считается не каждый возврат. Считаются basic.reject и закрытие канала с неподтверждённой доставкой. basic.nack с requeue возвращает сообщение без счёта.

Сообщение, которое покидает очередь из-за отклонения без requeue или после превышения предела доставок, уходит в обменник недоставленных сообщений этой очереди, если он задан (x-dead-letter-exchange и необязательный x-dead-letter-routing-key). Очередь без такого обменника сообщение отбрасывает.

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

Тип очереди - это тип дескриптора, потому что от него зависит, что делает переобработка: RabbitQueue для классической очереди и RabbitQuorumQueue для кворумной. У дескриптора кворумной очереди нет шагов durable, exclusive и auto_delete: кворумная очередь всегда устойчива и общая.

Отрицательный исход крейт подтверждает кадром basic.reject, а не basic.nack. Для одной доставки оба кадра делают одно и то же, но в кворумной очереди считается только отклонение. Поэтому retry() обработчика расходует одну из доставок сообщения, и предел очереди останавливает сообщение, обработка которого раз за разом не удаётся. Как каждый тип очереди отвечает на переобработку, показывает страница Подтверждение и переобработка.

Правила очередей задаёт RabbitMQ (классические очереди, кворумные очереди, обработка «отравленных» сообщений, обменники недоставленных сообщений).