Introduction
When ShopNest order is placed, inventory, email, and analytics react asynchronously via RabbitMQ and MassTransit — decoupling failure domains.
After this article you will
- Run RabbitMQ in Docker
- Publish OrderCreatedEvent with MassTransit
- Build consumers for email and inventory
- Understand dead letter queues and retries
- Compare Azure Service Bus for cloud
Prerequisites
- Article 51 — Microservices Introduction
- ShopNest API, EF Core, and DI from prior modules
Concept deep-dive
// Publish from Order API
await _publishEndpoint.Publish(new OrderCreatedEvent
{
OrderId = order.Id,
CustomerEmail = order.CustomerEmail,
Lines = order.Lines.Select(l => new { l.ProductId, l.Qty }).ToList()
});
// Consumer
public class SendOrderEmailConsumer : IConsumer<OrderCreatedEvent>
{
public async Task Consume(ConsumeContext<OrderCreatedEvent> context)
{
await _email.SendOrderConfirmationAsync(context.Message);
}
}
builder.Services.AddMassTransit(x =>
{
x.AddConsumer<SendOrderEmailConsumer>();
x.AddConsumer<UpdateInventoryConsumer>();
x.UsingRabbitMq((ctx, cfg) =>
{
cfg.Host("localhost", "/", h => { h.Username("guest"); h.Password("guest"); });
cfg.ConfigureEndpoints(ctx);
});
});
Saga: coordinate multi-step distributed workflow with compensating actions. DLQ: failed messages after retries for manual inspection.
Hands-on — ShopNest Order Processing with Async Events
- docker run rabbitmq:3-management.
- MassTransit OrderCreatedEvent + two consumers.
- Simulate consumer failure — message retries then DLQ.
- Note Azure Service Bus swap via MassTransit transport config.
Common errors & best practices
- No idempotent consumers — duplicate messages double-charge inventory.
- Sync HTTP chain pretending to be async — use real messaging.
Interview questions
Q: Why message queue?
A: Decouple producers/consumers; absorb spikes; retry on failure.
Q: MassTransit role?
A: Abstraction over RabbitMQ/ASB with consumers, sagas, retries built in.
Q: At-least-once delivery?
A: Consumers must be idempotent — handle duplicate events safely.
Summary
- OrderCreatedEvent triggers parallel downstream work
- RabbitMQ + MassTransit standard for .NET microservices
- DLQ and retries handle transient failures
- Azure Service Bus for managed cloud messaging
Previous: Microservices Introduction
Next: gRPC with ASP.NET Core
FAQ
Kafka vs RabbitMQ?
Kafka for event streaming at scale; RabbitMQ great for task queues and ShopNest order flows.
Transactional outbox?
Publish events reliably with DB commit — advanced pattern for consistency.