Какие виды очередей существуют в RabbitMQ и какой самый производительный?
Что проверяют
Знаете ли вы актуальные типы очередей RabbitMQ и отличаете ли тип от свойств очереди. Вторая часть с подвохом: ответ «зависит от сценария», и нужно назвать, от чего именно.
Как отвечать
Типов в RabbitMQ 4.x три, задаются аргументом x-queue-type:
- classic: исходный тип, живёт на одном узле. Минимум накладных расходов, но без репликации: упал узел, очередь недоступна. Зеркалирование классических очередей удалено в 4.0;
- quorum: реплицируется на несколько узлов по Raft, всегда durable. Выбор по умолчанию для важных данных. Есть лимит повторных доставок, который отсекает «ядовитые» сообщения;
- stream: журнал только на дописывание, чтение не удаляет сообщения. Потребитель читает со своего смещения (
x-stream-offset) и может перечитать историю. Для .NET есть отдельный клиентRabbitMQ.Stream.Client.
durable, exclusive, auto-delete, TTL и приоритеты это свойства очереди, а не типы.
Про скорость: по пропускной способности лидируют стримы, особенно через stream-протокол, quorum платит за надёжность записью на большинство реплик. Но чаще скорость определяют настройки клиента, а не тип:
- prefetch:
BasicQosAsync(0, 50, false). Без лимита брокер вывалит на потребителя всю очередь, а prefetch 1 превращает поток в пинг-понг; - подтверждения: publisher confirms пачками, а не ожидание на каждое сообщение, и групповые
ackу потребителя; - соединения: одно долгоживущее соединение и отдельные каналы.
В RabbitMQ.Client с версии 7 API асинхронный: CreateConnectionAsync(), CreateChannelAsync(), IChannel вместо IModel. Тип указывают при объявлении, в словаре arguments метода QueueDeclareAsync.
Где спотыкаются
Называют durable или lazy очереди отдельными типами. Lazy-режим к тому же устарел: классические очереди с 3.12 сами держат в памяти лишь малую часть сообщений.
Отвечают «стримы самые быстрые» без оговорок. Стрим не заменяет очередь задач: он не удаляет обработанное и не раздаёт сообщения конкурирующим потребителям так, как quorum-очередь.
Открывают соединение на каждое сообщение. Установка AMQP-соединения стоит нескольких сетевых обменов, это дороже любого выбора типа.