Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Классические и кворумные очереди
Классическая очередь хранится на одном узле и ничего не считает; кворумная очередь реплицируется, считает неудачные доставки и сама убирает сообщение, исчерпавшее попытки.
Схема текстом
- Классическая очередь: Сообщения хранит один узел; reject с requeue: снова в очереди, без счёта; reject без requeue: к недоставленным или отбрасывается
- Кворумная очередь: Лидер и его последователи, Raft; reject с requeue: снова в очереди, x-delivery-count + 1; Предел превышен: к недоставленным или отбрасывается
- reject с requeue: снова в очереди, x-delivery-count + 1 → Предел превышен: к недоставленным или отбрасывается: предел превышен
- С 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 (классические очереди, кворумные очереди, обработка «отравленных» сообщений, обменники недоставленных сообщений).