DEV Community

Cover image for Fluent Brighter: Como configurar o Postgres
Rafael Andrade
Rafael Andrade

Posted on

Fluent Brighter: Como configurar o Postgres

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

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; }
}
Enter fullscreen mode Exit fullscreen mode
  • 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
}
Enter fullscreen mode Exit fullscreen mode

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);
    }
}
Enter fullscreen mode Exit fullscreen mode

Configurando Postgres com Fluent.Brighter

Comece registrando o serviço em seu contêiner de DI:

services.AddFluentBrighter(opt => 
{
    // Configuração vai aqui
});
Enter fullscreen mode Exit fullscreen mode

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"))
    );
});
Enter fullscreen mode Exit fullscreen mode

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")))
    );
});
Enter fullscreen mode Exit fullscreen mode

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(/**/)));
  });
Enter fullscreen mode Exit fullscreen mode

4. Configurando o Inbox

Para configurar o inbox com Postgres, use UsePostgresInbox:

services
  .AddHostedService<ServiceActivatorHostedService>()
  .AddFluentBrighter(builder =>
  {
    builder
      .Subscriptions(x => x.UsePostgresInbox(new RelationalDatabaseConfiguration(/**/)));
  });
Enter fullscreen mode Exit fullscreen mode

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)));
     });
Enter fullscreen mode Exit fullscreen mode

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)