Implementando um Publicador e Consumidor SQS Usando .NET
Em um post anterior, introduzi o conceito de filas e seu uso. Agora, explicarei como implementar um Consumer (consumidor) e Publisher (publicador) SQS usando C# e .NET.
#
SQS
SQS (Simple Queue Service) é um serviço da Amazon Web Services que permite enviar, armazenar e receber mensagens entre componentes de software em qualquer volume, garantindo que nenhuma mensagem seja perdida e eliminando a necessidade de disponibilidade imediata de outros serviços.
Uma das melhores características do SQS é sua relação custo-benefício; é gratuito para até 1 milhão de solicitações por mês, após o qual a Amazon começa a cobrar pelo serviço.
Para começar, você precisa criar uma conta na AWS e navegar até o AWS Management Console.
No console, procure por SQS e selecione a primeira opção, Simple Queue Service. Clique em “Create queue”, nomeie sua fila e vá até o final da página para clicar em “Create queue”. As configurações padrão são suficientes para começar, mas sinta-se à vontade para ajustá-las conforme necessário.
##
AWS Command Line Interface
A AWS Command Line Interface (CLI) permite fazer alterações diretamente do terminal, sem a necessidade de usar o AWS Management Console. Por exemplo, para listar todos os buckets do S3, você pode usar o seguinte comando:
aws s3api list-buckets
Para poder fazer isso, precisamos instalar a CLI, o tutorial para Windows, Linux e macOS está aqui.
Após a instalação, é necessário autenticar sua máquina contra a AWS.
No console da AWS, clique no seu nome e vá para Credenciais de Segurança, lá, você precisa criar uma Chave de Acesso.
No seu console, digite:
aws configure
Em seguida, forneça sua chave de acesso e token quando solicitado.
Importante, no console da AWS você tem uma região, a minha é us-east-1, você pode ver a sua verificando a URL: https://us-east-1.console.aws.amazon.com/
Essa região precisa ser informada durante a configuração da AWS para poder acessar os recursos localmente.
Após a configuração, você poderá executar o comando de listar buckets:
aws s3api list-buckets
#
Publisher
O que é um publisher?
Um publisher é um serviço que detecta mudanças ou eventos e envia uma mensagem para uma fila. No contexto do exemplo discutido no post anterior sobre filas, o publisher reside dentro de uma API. Por exemplo, após criar um novo usuário, o publisher envia uma mensagem para a fila para notificar outras partes do sistema sobre este evento.
Agora que temos nossa configuração pronta, vamos criar o publisher.
Para simplicidade, este exemplo focará apenas no componente do publisher. Você pode integrar essa implementação à sua API conforme necessário.
Usaremos um aplicativo de console para esta demonstração.
Abra seu terminal ou prompt de comando e execute o seguinte comando para criar uma nova pasta chamada publisher:
Crie uma nova pasta:
mkdir publisher
Entre na pasta:
cd publisher
Crie o projeto:
dotnet new console
É necessário um model:
public class CustomerCreated
{
public Guid Id { get; init; }
public string FullName { get; init; }
public string Email { get; init; }
public DateTime DateOfBirth { get; init; }
}
E instale o AWS SDK
dotnet add package AWSSDK.SQS --version 3.7.100.78
Então na classe Program precisamos criar o request e enviá-lo:
using System.Text.Json;
using Amazon.SQS;
using Amazon.SQS.Model;
var sqsCLient = new AmazonSQSClient();
var customer = new CustomerCreated
{
Id = Guid.NewGuid(),
FullName = "Amanda Mata",
Email = "email@email.com",
DateOfBirth = new DateTime(1996, 06, 18)
};
var queueUrlResponse = await sqsCLient.GetQueueUrlAsync("customers");
var sendMessageRequest = new SendMessageRequest
{
QueueUrl = queueUrlResponse.QueueUrl,
MessageBody = JsonSerializer.Serialize(customer),
MessageAttributes = new Dictionary<string, MessageAttributeValue>
{
{
"MessageType", new MessageAttributeValue
{
DataType = "String",
StringValue = nameof(CustomerCreated)
}
}
}
};
var response = await sqsCLient.SendMessageAsync(sendMessageRequest);
Console.WriteLine();
No sqsCLient.GetQueueUrlAsync(“customers”) eu utilizei “customers” porque esse é o nome da minha fila
#
Consumer
O que é um Consumer?
Um consumer é um serviço projetado para ouvir a fila. Ele espera que as mensagens cheguem à fila e as processa de acordo com a lógica de negócios definida. Para esta parte da implementação, também usaremos um aplicativo de console para demonstrar como um consumidor pode ser configurado para ouvir e processar mensagens da fila.
Crie uma nova pasta:
mkdir consumer
Entre na pasta:
cd consumer
Crie o projeto:
dotnet new console
É necessário um model:
public class CustomerCreated
{
public Guid Id { get; init; }
public string FullName { get; init; }
public string Email { get; init; }
public DateTime DateOfBirth { get; init; }
}
E instale o AWS SDK
dotnet add package AWSSDK.SQS --version 3.7.100.78
Depois disso, no Program, precisamos receber a solicitação:
using Amazon.SQS;
using Amazon.SQS.Model;
var cts = new CancellationTokenSource();
var sqsCLient = new AmazonSQSClient();
var queueUrlResponse = await sqsCLient.GetQueueUrlAsync("customers");
var receiveMessageRequest = new ReceiveMessageRequest
{
QueueUrl = queueUrlResponse.QueueUrl,
AttributeNames = new List<string>{ "All" },
MessageAttributeNames = new List<string>{ "All" }
};
while(!cts.IsCancellationRequested)
{
var response = await sqsCLient.ReceiveMessageAsync(receiveMessageRequest, cts.Token);
response.Messages.ForEach(async message => {
Console.WriteLine($"Message Id: { message.MessageId }");
Console.WriteLine($"Message Body: { message.Body }");
await sqsCLient.DeleteMessageAsync(queueUrlResponse.QueueUrl, message.ReceiptHandle);
});
await Task.Delay(3000);
}
Console.WriteLine();
Agora que tanto o publicador quanto o consumidor foram criados, você tem a opção de verificar as mensagens diretamente do console da AWS. No entanto, simplesmente executando o publicador e o consumidor, você poderá observar o processo de envio e recebimento de mensagens em ação.
Eu criei esse post para meus estudos, os aprendizados passados aqui foram obtidos através do curso Cloud Fundamentals: AWS Services for C# Developers course.