Ответ
В RabbitMQ термин "Partition" (раздел) обычно относится к механизмам распределения и репликации данных для обеспечения отказоустойчивости и производительности. Основные реализации — Mirrored Queues (классические зеркалируемые очереди) и Quorum Queues (современные очереди на основе консенсуса).
Quorum Queues (рекомендуемый подход с версии 3.8+)
Это очереди, где данные реплицируются между несколькими узлами кластера с использованием алгоритма консенсуса Raft. Они обеспечивают высокую доступность и сохранность сообщений.
Пример объявления на C#:
var factory = new ConnectionFactory() { HostName = "localhost" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
var args = new Dictionary<string, object>
{
{ "x-queue-type", "quorum" }
};
channel.QueueDeclare(queue: "my_quorum_queue",
durable: true,
exclusive: false,
autoDelete: false,
arguments: args);
Ключевые особенности Quorum Queues:
- Отказоустойчивость: Сообщения реплицируются на большинство узлов (N/2 + 1). При падении лидера автоматически выбирается новый.
- Гарантии доставки: Сообщение считается записанным только после подтверждения кворумом реплик.
- Ограничения: Нет поддержки TTL (Time-To-Live) для отдельных сообщений и DLX (Dead Letter Exchanges) в классическом виде. Для истечения срока жизни используется политика на уровне очереди (
x-message-ttl). - Производительность: Оптимизированы для сценариев, где надежность важнее абсолютной латентности.
Mirrored Queues (устаревающий подход)
Классические очереди с зеркалированием, где один узел является лидером, а другие — зеркалами. При падении лидера одно из зеркал становится новым лидером. Менее надежны, чем Quorum Queues, так как репликация асинхронная и возможна потеря данных.
Когда использовать:
- Quorum Queues — для большинства новых проектов, где критична сохранность данных.
- Mirrored Queues — для легационных систем или когда нужны функции, отсутствующие в Quorum Queues (например, DLX для отдельных сообщений).