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
- .NET 8 ou superior
- Um projeto .NET com estes pacotes NuGet
- Paramore.Brighter.MessagingGateway.AWS.V4: Habilita a integração com AWS SDK V4 SNS/SQS.
- Paramore.Brighter.ServiceActivator.Extensions.DependencyInjection: Permite registrar o Brighter com o Microsoft DI.
- Paramore.Brighter.ServiceActivator.Extensions.Hosting: Hospeda o Brighter como um serviço em segundo plano.
- Serilog.AspNetCore: Para logging estruturado (opcional, mas recomendado).
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; }
- 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; } }
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); } }
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 );
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); })
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(); });
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)