Ответ
RabbitMQ применялся в проектах для асинхронной коммуникации и повышения отказоустойчивости. Основные сценарии использования:
- Фоновая обработка задач: Отправка email, генерация отчетов PDF или обработка загруженных изображений. Пользовательский запрос не блокируется, а задача ставится в очередь.
- Интеграция микросервисов: Слабая связность между сервисами. Например, сервис заказов публикует событие
OrderPlaced, а сервис доставки и сервис уведомлений подписываются на него независимо. - Балансировка нагрузки (Work Queues): Распределение задач между несколькими экземплярами воркеров для горизонтального масштабирования.
- Гарантированная доставка: Использование подтверждений (acknowledgments) и устойчивых (durable) очередей гарантирует, что сообщение не потеряется при перезапуске брокера или воркера.
- Pub/Sub (Publish/Subscribe): Рассылка одного сообщения множеству потребителей. Например, уведомление всех онлайн-пользователей о системном событии.
Пример публикации сообщения на C# (RabbitMQ.Client):
var factory = new ConnectionFactory() { HostName = "rabbitmq-host" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
// Объявляем durable очередь
channel.QueueDeclare(queue: "order.queue",
durable: true, // Сохранить очередь при перезапуске
exclusive: false,
autoDelete: false,
arguments: null);
var message = JsonSerializer.Serialize(new { OrderId = 123, Action = "Process" });
var body = Encoding.UTF8.GetBytes(message);
// Публикуем с флагом persistent
var properties = channel.CreateBasicProperties();
properties.Persistent = true; // Сохранить сообщение на диске
channel.BasicPublish(exchange: "",
routingKey: "order.queue",
basicProperties: properties,
body: body);
Console.WriteLine($"Sent: {message}");
Почему RabbitMQ: Надежность, поддержка различных протоколов (AMQP 0-9-1), гибкая маршрутизация через exchanges, хорошая экосистема и управление через веб-интерфейс.