Estratégia de Messaging - Plataforma MeAjudaAi¶
1. Visão Geral¶
Este documento descreve a estratégia completa de messaging da plataforma MeAjudaAi, focada exclusivamente no RabbitMQ para todos os ambientes (desenvolvimento e produção) e NoOp/Mocks para ambientes de teste, garantindo isolamento e confiabilidade.
2. MessageBus por Ambiente¶
2.1 Resumo da Implementação¶
✅ A implementação garante seleção automática de MessageBus por ambiente: - RabbitMQ para desenvolvimento e produção - NoOp/Mocks para testes (sem dependências externas)
2.2 Factory Pattern para Seleção de MessageBus¶
Arquivo: src/Shared/Messaging/Factories/MessageBusFactory.cs
public class MessageBusFactory : IMessageBusFactory
{
private readonly IHostEnvironment _environment;
private readonly IConfiguration _configuration;
private readonly IServiceProvider _serviceProvider;
public MessageBusFactory(
IHostEnvironment environment,
IConfiguration configuration,
IServiceProvider serviceProvider)
{
_environment = environment;
_configuration = configuration;
_serviceProvider = serviceProvider;
}
public IMessageBus CreateMessageBus()
{
var rabbitMqEnabled = _configuration.GetValue<bool?>("RabbitMQ:Enabled");
if (_environment.IsEnvironment(EnvironmentNames.Testing))
{
// TESTE: Sempre NoOp para evitar dependências externas
return _serviceProvider.GetRequiredService<NoOpMessageBus>();
}
else
{
// PADRÃO (Dev/Prod): RabbitMQ (apenas se explicitamente habilitado) ou NoOp (fallback)
if (rabbitMqEnabled != false)
{
return _serviceProvider.GetRequiredService<RabbitMqMessageBus>();
}
return _serviceProvider.GetRequiredService<NoOpMessageBus>();
}
}
}
2.3 Configuração de Dependency Injection¶
Arquivo: src/Shared/Messaging/MessagingExtensions.cs
// Registrar RabbitMQ e NoOp (fallback)
services.TryAddSingleton<RabbitMqMessageBus>();
services.TryAddSingleton<NoOpMessageBus>();
// Registrar o factory e o IMessageBus
services.AddSingleton<IMessageBusFactory, MessageBusFactory>();
services.AddSingleton<IMessageBus>(serviceProvider =>
{
var factory = serviceProvider.GetRequiredService<IMessageBusFactory>();
return factory.CreateMessageBus();
});
2.4 Configurações por Ambiente¶
Desenvolvimento (appsettings.Development.json)¶
{
"Messaging": {
"Enabled": true,
"RabbitMQ": {
"Enabled": true,
"ConnectionString": "amqp://guest:guest@localhost:5672/",
"DefaultQueueName": "MeAjudaAi-events-dev"
}
}
}
Produção (appsettings.Production.json)¶
{
"Messaging": {
"Enabled": true,
"RabbitMQ": {
"ConnectionString": "${RABBITMQ_CONNECTION_STRING}",
"DefaultQueueName": "MeAjudaAi-events-prod"
}
}
}
2.5 Dead Letter Queue (DLQ)¶
A estratégia de Dead Letter Queue para RabbitMQ inclui: - ✅ Retentativa automática com backoff exponencial - ✅ Classificação inteligente de falhas - ✅ Dead Letter Exchange (DLX) automático - ✅ TTL configurável para mensagens na DLQ
2.6 Mocks para Testes¶
Testes de integração usam AddMessagingMocks() para substituir o sistema real por rastreadores em memória, permitindo verificar publicações sem infraestrutura externa.
3. Conclusão¶
A plataforma unificou sua infraestrutura de messaging no RabbitMQ, simplificando a arquitetura e garantindo paridade entre os ambientes de desenvolvimento e produção.