В каких сценариях вы использовали RabbitMQ?

«В каких сценариях вы использовали RabbitMQ?» — вопрос из категории Брокеры сообщений, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

RabbitMQ применялся в проектах для асинхронной коммуникации и повышения отказоустойчивости. Основные сценарии использования:

  1. Фоновая обработка задач: Отправка email, генерация отчетов PDF или обработка загруженных изображений. Пользовательский запрос не блокируется, а задача ставится в очередь.
  2. Интеграция микросервисов: Слабая связность между сервисами. Например, сервис заказов публикует событие OrderPlaced, а сервис доставки и сервис уведомлений подписываются на него независимо.
  3. Балансировка нагрузки (Work Queues): Распределение задач между несколькими экземплярами воркеров для горизонтального масштабирования.
  4. Гарантированная доставка: Использование подтверждений (acknowledgments) и устойчивых (durable) очередей гарантирует, что сообщение не потеряется при перезапуске брокера или воркера.
  5. 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, хорошая экосистема и управление через веб-интерфейс.