MassTransit и абстракции над брокерами

↑ 5.4 Очереди и брокеры: Kafka, RabbitMQ · ← Предыдущая · → Следующая

Обязательно~3 мин чтенияУровень: middle

Зачем это на собесе

Какие готовые библиотеки используют вместо ручной работы с брокером и чем они хороши/плохи.

Объяснение

MassTransit (и аналоги Wolverine, NServiceBus, Rebus, Brighter) — .NET-абстракция над брокерами (RabbitMQ, Kafka, Azure Service Bus, SQS, in-memory): сообщения, консьюмеры, retry, outbox, саги.

builder.Services.AddMassTransit(x =>
{
    x.AddConsumer<OrderPaidConsumer>();
    x.AddEntityFrameworkOutbox<AppDbContext>(o => { o.UsePostgres(); o.UseBusOutbox(); });   // transactional outbox
 
    x.UsingRabbitMq((ctx, cfg) =>
    {
        cfg.Host("rabbit");
        cfg.UseMessageRetry(r => r.Exponential(5, TimeSpan.FromSeconds(1), TimeSpan.FromMinutes(1), TimeSpan.FromSeconds(5)));
        cfg.ConfigureEndpoints(ctx);
    });
});
 
public record OrderPaid(Guid OrderId);
 
public class OrderPaidConsumer : IConsumer<OrderPaid>
{
    public async Task Consume(ConsumeContext<OrderPaid> ctx) { /* ... */ }
}
 
await publishEndpoint.Publish(new OrderPaid(id), ct);
ВозможностьЧто даёт
Retry, circuit breaker, rate limitустойчивость без ручного кода
Outbox/Inboxнадёжная доставка и дедупликация
Sagas / state machinesдолгие бизнес-процессы, оркестрация
Request/response, schedulingнадстройки поверх брокера
Тестовый harnessAddMassTransitTestHarness для тестов

Плюсы: единый API, готовые паттерны. Минусы: абстракция скрывает специфику брокера (партиции Kafka ≠ очереди RabbitMQ), версия v9+ стала коммерческой (лицензия для организаций) — обратите внимание на условия и альтернативы (Wolverine, Rebus).

Нюансы и подводные камни

  • Универсальная абстракция не даёт использовать всё богатство брокера; знайте модель под капотом.
  • Не проектируйте топологию «по умолчанию»: проверьте, какие exchange/очереди создаёт библиотека.
  • Сообщения — контракты: версионируйте типы и пространства имён.
  • Проверьте лицензирование библиотек до внедрения.

Практика

  1. Подключите MassTransit с RabbitMQ и outbox на EF Core.
  2. Реализуйте сагу «заказ → оплата → доставка».
  3. Напишите тест на consumer с TestHarness.

Вопросы с ответами

Связанные темы