Может ли MassTransit отправлять сообщения без использования брокера?

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

Ответ

Да, MassTransit поддерживает отправку сообщений без внешнего брокера через In-Memory Transport. Это полезно для модульного тестирования, локальной разработки или сценариев, где не требуется устойчивость и распределённость полноценного брокера (RabbitMQ, Azure Service Bus).

Пример настройки шины в памяти:

var busControl = Bus.Factory.CreateUsingInMemory(cfg =>
{
    cfg.ReceiveEndpoint("test_queue", ep =>
    {
        ep.Handler<YourMessage>(context => 
        {
            Console.WriteLine($"Received: {context.Message.Text}");
            return Task.CompletedTask;
        });
    });
});

await busControl.StartAsync();
await busControl.Publish(new YourMessage { Text = "Hello, In-Memory!" });

Ключевые особенности и ограничения In-Memory Transport:

  • Жизненный цикл сообщений: Сообщения хранятся только в памяти процесса и теряются при его остановке или перезапуске.
  • Распределённость: Не подходит для взаимодействия между разными процессами или машинами — это транспорт в рамках одного приложения.
  • Гарантии доставки: Не предоставляет персистентности и гарантий доставки, характерных для брокеров.
  • Тестирование: Для интеграционных тестов рекомендуется использовать In-Memory Test Harness, который предоставляет удобные методы проверки отправленных и потреблённых сообщений.

Практический совет: Используйте In-Memory Transport для изоляции бизнес-логики от инфраструктуры в тестах, но для staging- и production-сред всегда настраивайте реальный брокер.