Nos meus artigos anteriores sobre Fluent Brighter e migrando o Postgres outbox para v10, abordei a integração com RabbitMQ. Neste artigo, vou demonstrar como configurar o Postgres para funcionalidades de outbox, inbox e gateway de mensagens usando o Fluent Brighter.
Requisitos
- .NET 8+ ou netstandard2.0
- Pacotes NuGet necessários:
- Fluent.Brighter.Postgres - Pacote de integração com Postgres
- Paramore.Brighter.ServiceActivator.Extensions.Hosting - Integração do Service Activator para tarefas em segundo plano
Revisão dos Fundamentos do Brighter
Antes de mergulhar no Fluent.Brighter
, vamos revisar os conceitos básicos do Brighter:
Requisições (Comandos/Eventos)
Defina mensagens usando IRequest
:
public class OrderPlaced : Event(Id.Random())
{
public string OrderId { get; set; } = string.Empty;
public decimal Value { get; set; }
}
-
Comandos: Direcionados a um único destinatário (ex:
ProcessOrderCommand
) -
Eventos: Notificações de broadcast (ex:
OrderPlacedEvent
)
Mapeador de Mensagens (Opcional)
Traduz entre mensagens do Brighter e objetos da aplicação (a serialização JSON é o padrão):
public class OrderPlacedMapper : IAmAMessageMapper<OrderPlaced>, IAmAMessageMapperAsync<OrderPlaced>
{
// Implementação
}
Manipulador de Requisições
Processa mensagens de entrada:
public class OrderPlacedHandler(ILogger<OrderPlacedHandler> logger)
: RequestHandler<OrderPlaced>
{
public override OrderPlaced Handle(OrderPlaced command)
{
logger.LogInformation("Pedido {OrderId} realizado com valor {OrderValue}",
command.OrderId, command.Value);
return base.Handle(command);
}
}
Configurando Postgres com Fluent.Brighter
Comece registrando o serviço em seu contêiner de DI:
services.AddFluentBrighter(opt =>
{
// Configuração vai aqui
});
1. Registrando Assinaturas
Configure assinaturas Postgres usando AddPostgresSubscription
:
services.AddFluentBrighter(opt =>
{
opt.Subscriptions(x => x
.AddRabbitMqChannelFactory(new RelationalDatabaseConfiguration(...))
.AddPostgresSubscription(new PostgresSubscription(/*...*/))
.AddPostgresSubscription(b => b
.SetQueue("greeting.queue"))
);
});
2. Registrando Publicações
Configure publicações com AddPostgresPublication
:
services.AddFluentBrighter(opt =>
{
opt.Producers(opt => opt
.AddPostgresPublication(rp => rp
.SetConnection(new RelationalDatabaseConfiguration(/*...*/))
.AddPublication(new PostgresPublication { /*...*/ })
.AddPublication(p => p.SetQueue("greeting.event.topic")))
);
});
3. Configurando o Outbox
Para configurar o outbox com Postgres, use UsePostgresOutbox
:
services
.AddHostedService<ServiceActivatorHostedService>()
.AddFluentBrighter(builder =>
{
builder
.UseDbTransactionOutboxArchive()
.UseOutboxSweeper()
.Producers(x => x.UsePostgresOutbox(new RelationalDatabaseConfiguration(/**/)));
});
4. Configurando o Inbox
Para configurar o inbox com Postgres, use UsePostgresInbox
:
services
.AddHostedService<ServiceActivatorHostedService>()
.AddFluentBrighter(builder =>
{
builder
.Subscriptions(x => x.UsePostgresInbox(new RelationalDatabaseConfiguration(/**/)));
});
5. Configuração Unificada do Postgres
Use UsingPostgres
para definir as configurações de conexão uma única vez para todos os componentes:
services
.AddHostedService<ServiceActivatorHostedService>()
.AddFluentBrighter(builder => builder
.UseDbTransactionOutboxArchive()
.UseOutboxSweeper()
.UsingPostgres(cfg =>
{
cfg.SetConnection(c => c
.SetConnectionString("Host=localhost;Username=postgres;Password=password;Database=brightertests;")
.SetOutboxTableName("some_outbox_table"));
cfg
.UseInbox()
.UseOutbox()
.UsePublications(pp => pp
.AddPublication<GreetingEvent>(p => p.SetQueue("greeting.queue"))
.AddPublication<FarewellEvent>(p => p.SetQueue("farewell.queue")))
.UseSubscriptions(sb => sb
.AddSubscription<GreetingEvent>(s => s
.SetQueue("greeting.queue")
.SetMessagePumpType(MessagePumpType.Reactor))
.AddSubscription<FarewellEvent>(s => s
.SetQueue("farewell.queue")
.SetMessagePumpType(MessagePumpType.Reactor)));
});
Conclusão
Este artigo demonstra como configurar o Postgres para funcionalidades de outbox, inbox e gateway de mensagens com o Fluent Brighter. A abordagem de configuração unificada usando UsingPostgres
simplifica a configuração mantendo a flexibilidade para cenários mais complexos.
Para um exemplo completo funcional, confira a implementação completa no GitHub.
Top comments (0)