DEV Community

Cover image for Integrando o Brighter V10 com AWS SDK v4
Rafael Andrade
Rafael Andrade

Posted on

Integrando o Brighter V10 com AWS SDK v4

Em artigos anteriores, abordei Migrando para o Brighter V10 com AWS SNS/SQS. Este guia se concentra na integração do Brighter V10 com o AWS SDK v4.

AWS SDK v4

O AWS SDK v4 representa uma evolução significativa em relação às versões anteriores com várias mudanças importantes:

  • Suporte Assíncrono Aprimorado: O SDK agora adota totalmente os padrões async/await em toda a sua estrutura, eliminando chamadas bloqueantes e melhorando a utilização de recursos

  • Injeção de Dependência Modernizada: Integração aprimorada com o Microsoft.Extensions.DependencyInjection, tornando o registro e a configuração mais simples

  • Otimizações de Desempenho: Redução de alocação de memória e aumento do throughput para cenários de mensagens de alto volume

  • Tratamento de Erros Aprimorado: Tipos de exceção mais granulares e mecanismos de retry melhorados

Essas mudanças exigiram que o Brighter criasse pacotes de integração dedicados para manter a compatibilidade enquanto aproveita as novas capacidades do SDK.

Por que o Brighter tem 2 pacotes para AWS SNS/SQS

O Brighter fornece dois pacotes de integração distintos com a AWS para atender a diferentes necessidades de desenvolvimento:

  • Paramore.Brighter.MessagingGateway.AWSSQS - Para integração com AWS SDK v3
  • Paramore.Brighter.MessagingGateway.AWS.V4 - Para integração com AWS SDK v4

Não há diferença funcional significativa entre os dois pacotes em termos das capacidades principais de mensagens do Brighter. A separação existe apenas para suportar diferentes versões do AWS SDK, permitindo que as equipes:

  • Miguem para o Brighter V10 sem serem forçadas a atualizar o AWS SDK simultaneamente
  • Mantenham a compatibilidade com dependências existentes do AWS SDK v3
  • Adotem gradualmente o AWS SDK v4 no seu próprio ritmo

Escolha o pacote que corresponde à sua versão atual do AWS SDK - a interface da API do Brighter permanece consistente independentemente de qual pacote da AWS você selecionar.

Requisitos

Revisão do Brighter

Antes de continuar com a configuração do AWS SNS/SQS, vamos revisar o que já sabemos sobre o Brighter.

Request (Command/Event)

Defina mensagens usando IRequest:

public class Greeting() : Event(Id.Random())
{
    public string Name { get; set; } = string.Empty;
}
Enter fullscreen mode Exit fullscreen mode
  • Commands: Operações para um único destinatário (ex: SendEmail).
  • Events: Notificações de broadcast (ex: OrderShipped).

Message Mapper (Opcional)

Traduz entre as mensagens do Brighter e os objetos do seu aplicativo:

public class SqsFifoMapper : IAmAMessageMapperAsync<SqsFifoEvent>
{
    public Task<Message> MapToMessageAsync(SqsFifoEvent request, Publication publication,
        CancellationToken cancellationToken = new CancellationToken())
    {
        return Task.FromResult(new Message(new MessageHeader
            {
                MessageId = request.Id,
                Topic = publication.Topic!,
                PartitionKey = request.PartitionValue, // Requisito para FIFO
                MessageType = MessageType.MT_EVENT,
                TimeStamp = DateTimeOffset.UtcNow
            }, 
            new MessageBody(JsonSerializer.SerializeToUtf8Bytes(request, JsonSerialisationOptions.Options))));
    }

    public Task<SqsFifoEvent> MapToRequestAsync(Message message, CancellationToken cancellationToken = new CancellationToken())
    {
        return Task.FromResult(JsonSerializer.Deserialize<SqsFifoEvent>(message.Body.Bytes, JsonSerialisationOptions.Options)!);
    }

    public IRequestContext? Context { get; set; }
}
Enter fullscreen mode Exit fullscreen mode

Request Handler

Processa as mensagens recebidas:

public class GreetingHandler(ILogger<GreetingHandler> logger) : RequestHandler<Greeting>
{
    public override Greeting Handle(Greeting command)
    {
        logger.LogInformation("Hello {Name}", command.Name);
        await processor.PostAsync(new Farewell { Name = command.Name }, cancellationToken: cancellationToken);
        return base.Handle(command);
    }
}
Enter fullscreen mode Exit fullscreen mode

Configurando o Brighter com AWS SNS/SQS

1. Configuração da Conexão

Defina os detalhes da conexão com o AWS SNS:

 var connection = new AWSMessagingGatewayConnection(new BasicAWSCredentials("test", "test"), 
            RegionEndpoint.USEast1,
            cfg => cfg.ServiceURL = "http://localhost:4566" // LocalStack
); 
Enter fullscreen mode Exit fullscreen mode

2. Inscrição no SQS

Inscreva-se em um SQS, neste exemplo mostrarei como conectar SNS para SQS, SQS para SQS e SNS para SQS FIFO:

.AddConsumers(opt =>
{
    opt.Subscriptions = [
         // SNS → SQS
         new SqsSubscription<Greeting>(
             "greeting-subscription", // Opcional
             "greeting-queue", // Nome da fila SQS
             ChannelType.PubSub,  // Necessário para SNS
             "greeting.topic".ToValidSNSTopicName(), // Nome do Tópico SNS
             bufferSize: 2, 
             messagePumpType: MessagePumpType.Proactor),

          // SQS → SQS (Point-to-Point)
         new SqsSubscription<Farewell>(
             new SubscriptionName("farawell-subscription"), // Opcional
             new ChannelName("farewell.queue"), // Nome da fila SQS
             ChannelType.PointToPoint, // SQS Direto
             new RoutingKey("farewell.queue".ToValidSQSQueueName()), // Nome do Tópico SNS
             bufferSize: 2,
             messagePumpType: MessagePumpType.Proactor),

         // FIFO SNS → SQS
         new SqsSubscription<SnsFifoEvent>(
             new SubscriptionName("sns-sample-fifo-subscription"), // Opcional
             new ChannelName("sns-sample-fifo".ToValidSQSQueueName(true)), // Nome da fila SQS
             ChannelType.PubSub, 
             new RoutingKey("sns-sample-fifo".ToValidSNSTopicName(true)), // Nome do Tópico SNS
             bufferSize: 2,
             messagePumpType: MessagePumpType.Proactor,
             topicAttributes: new SnsAttributes { Type = SqsType.Fifo }, // FIFO
             queueAttributes: new SqsAttributes(type: SqsType.Fifo)), // FIFO
    ];

    opt.DefaultChannelFactory = new ChannelFactory(connection);
})
Enter fullscreen mode Exit fullscreen mode

3. Configuração do Produtor SNS/SQS

Publique eventos em um tópico, como queremos produzir para múltiplos tipos de publicação (SNS e SQS), precisaremos usar o CombinedProducerRegistryFactory:

.AddProduces(opt =>
{
    opt.ProducerRegistry = new CombinedProducerRegistryFactory(
        // Produtores SNS
        new SnsMessageProducerFactory(connection, [
            new SnsPublication<Greeting>
            {
                Topic = "greeting.topic".ToValidSNSTopicName(), 
                MakeChannels = OnMissingChannel.Create
            },
            new SnsPublication<SnsFifoEvent>
            {
                Topic = "sns-sample-fifo".ToValidSNSTopicName(true),
                MakeChannels = OnMissingChannel.Create,
                TopicAttributes = new SnsAttributes
                {
                    Type = SqsType.Fifo
                }
            }
       ]),

       // Produtores SQS
       new SqsMessageProducerFactory(connection, [
           new SqsPublication<Farewell>
           {
               ChannelName = "farewell.queue".ToValidSQSQueueName(), 
               Topic = "farewell.queue".ToValidSQSQueueName(), 
               MakeChannels = OnMissingChannel.Create
            }
        ])
      ).Create();
});
Enter fullscreen mode Exit fullscreen mode

Conclusão

Integrar o Brighter V10 com o AWS SDK v4 fornece uma infraestrutura de mensagens moderna e eficiente que aproveita os últimos aprimoramentos do AWS SDK, mantendo os padrões familiares de command e event do Brighter. Compreendendo as sutis diferenças entre as versões do AWS SDK e seguindo os padrões de configuração descritos aqui, você pode construir soluções de mensagens robustas e escaláveis com separação adequada de responsabilidades.

A abordagem de dois pacotes garante caminhos de migração suaves, quer você esteja começando do zero com o SDK v4 ou planejando uma transição gradual do SDK v3. Com a configuração adequada de inscrições e produtores, o Brighter lida com os detalhes complexos da infraestrutura de mensagens, permitindo que você se concentre na sua lógica de negócios.

Top comments (0)