Ответ
Batch-обработка в RabbitMQ позволяет эффективно подтверждать и обрабатывать группы сообщений, снижая нагрузку на сеть и брокер. Основной механизм — ручное подтверждение (manual acknowledgement) с накоплением delivery tags и подтверждением пачкой.
Ключевые шаги:
- Отключить авто-подтверждение (
autoAck: false). - Настроить
BasicQosдля контроля prefetch count. - Накопить batch сообщений в памяти.
- Обработать batch и подтвердить все сообщения одним вызовом
BasicAckс флагомmultiple: true.
Пример на C# (RabbitMQ.Client):
var factory = new ConnectionFactory() { HostName = "localhost" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
// 1. Настройка prefetch. Важно: prefetch >= размера batch.
channel.BasicQos(prefetchSize: 0, prefetchCount: 100, global: false);
// 2. Создание consumer с ручным подтверждением.
var consumer = new EventingBasicConsumer(channel);
var pendingDeliveryTags = new List<ulong>();
const int batchSize = 50;
consumer.Received += (model, ea) => {
pendingDeliveryTags.Add(ea.DeliveryTag);
// 3. Накопление batch.
if (pendingDeliveryTags.Count >= batchSize) {
ProcessMessageBatch(ea.Body.ToArray()); // Ваша логика обработки
// 4. Подтверждение пачки.
var lastTag = pendingDeliveryTags.Last();
channel.BasicAck(deliveryTag: lastTag, multiple: true);
pendingDeliveryTags.Clear();
}
};
channel.BasicConsume(queue: "myQueue", autoAck: false, consumer: consumer);
Практические нюансы:
- Надёжность: При падении потребителя все неподтверждённые сообщения (включая накопленные в batch) будут повторно доставлены другим потребителям.
- Таймаут batch: Добавьте таймер для подтверждения неполного batch по истечении времени, чтобы избежать длительных задержек.
- Память: Управляйте размером batch, чтобы не исчерпать память.
- Качество обслуживания (QoS):
BasicQosсglobal: falseприменяется к каждому новому потребителю отдельно.