Ответ
RabbitMQ сам по себе не предназначен для долгосрочного хранения истории сообщений. Это брокер, обеспечивающий доставку. Для аудита или повторной обработки нужны дополнительные механизмы.
Основные подходы:
-
Дублирование в очередь-архив: При публикации сообщения отправляем его и в основную очередь, и в очередь для логов. Потребитель архивной очереди сохраняет сообщения в постоянное хранилище.
# Пример на Python (pika) channel.basic_publish(exchange='', routing_key='orders', body=message) channel.basic_publish(exchange='', routing_key='orders_archive', body=message) -
Использование обменника (Exchange) типа
fanout: Можно привязать несколько очередей к одному обменнику. Одна для обработки, другая — для архивирования. -
Внешнее логирование перед отправкой: Сохранять сообщение в БД (например, PostgreSQL, MongoDB) или в Elasticsearch непосредственно в коде приложения перед вызовом
basic_publish. Это даёт полный контроль и возможность сложных запросов по истории. -
Плагины RabbitMQ:
- Firehose Tracer: Включает логирование всех сообщений, проходящих через брокер. Сильно влияет на производительность, подходит для отладки.
- Message Timestamping: Добавляет метку времени к сообщениям.
Рекомендация: Для большинства продакшен-систем я предпочитаю комбинацию подхода №3 (логирование в БД) и №1 (архивная очередь). Это обеспечивает надёжность: если логирование в БД временно недоступно, сообщение всё равно уйдёт в основную очередь, а архивная очередь его сохранит.