ASP.NET Core e Azure Service Bus: mensageria na nuvem – Parte 1

Neste artigo vou falar sobre como integrar sua aplicação ASP.NET Core com o serviço Azure Service Bus da plataforma da nuvem Microsoft Azure.

Antes de falar como isso será feito, vou falar sobre conceitos de mensageria, como a fila e a mensagem, e também sobre o próprio serviço Azure Service Bus.

O exemplo apresentado será de uma API que receberá dados de entrada sobre um seguimento de usuário em uma rede social, e publicará esses dados em uma mensagem para uma fila do Azure Service Bus. O objetivo do exemplo completo será ter um esquema de notificações via e-mail através de consumo de mensagens do Azure Service Bus.

Código fonte aqui.

Confira a parte 2


Introdução

Alguns conceitos a respeito de mensageira são essenciais para que se possa entender o Azure Service Bus e como ocorre o processamento de mensagens.

  • Mensagem: são um bloco de dados, em formato binário. Uma mensagem pode conter dados em diferentes formatos, como texto, JSON, XML, etc.
  • Fila: armazena diversas mensagens enquanto o cliente ou consumidor delas não as retira dela. Em uma fila, uma mensagem não pode ser processada mais de uma vez. Imagine como se fosse uma carta normal, indo para sua caixa de correio.
  • Tópico: semelhante a uma fila, porém permite envio de cópias de mensagens a diferentes clientes (ou assinantes). 

O fluxo, de maneira resumida, é o seguinte:

  • Uma mensagem é publicada em uma fila, sendo armazenada ali até que algum cliente a consuma;
  • Um cliente da fila solicita a próxima mensagem dela, a retirando da fila e processando;
  • Em caso de erro no processamento, a mensagem deve ser devolvida.

Mensagería: por que utilizar?

Ao se aprender quaisquer novos padrões, arquiteturas ou tecnologias, acho essencial se começar pelo PORQUÊ. Acima de qualquer hype que haja no mercado, focar nos benefícios que possam nos fornecer.

Utilizamos mensagens para, entre outras razões:

  • Diminuir acoplamento: Ao se solicitar informações de maneira síncrona, através de uma chamada HTTP por exemplo, o cliente fica a mercê da disponibilidade do servidor. Devido a essa dependência, mecanismos como Retry-Pattern e Circuit breaker são necessários. Com mensageria, a mensagem simplesmente segue armazenada na fila, onde será entregue assim que o cliente dela a consumir. Isso resulta também em maior liberdade para se escalar serviços de maneira isolada.
  • Permitir modelo Pub/Sub: com esse modelo, é possível enviar uma mensagem para diversos consumidores. Isso ocorre de maneira assíncrona e dinâmica, já que a quantidade de clientes pode aumentar ou diminuir, sem afetar os outros.
  • Isolar falhas: em caso de falha do servidor que publica a mensagem, as outras aplicações não serão afetadas. Quando o funcionamento do servidor for restaurado, a mensagem será publicada, e os clientes a receberão. 

Alguns exemplos de tecnologias que permitem isso, são o RabbitMQ, o Azure Service Bus, Amazon Simple Queue Service (SQS), entre outros.


Azure Service Bus

O Azure Service Bus é um serviço de mensageria oferecido pela palataforma de nuvem Microsoft Azure. Fora as funcionalidades descritas na introdução, ele possui recursos avançados como:

  • Sessões de mensagem;
  • Dead-letter queues
  • Agendamento de entregas
  • Envio em batch (ou lotes)
  • Transações
  • Deduplicação

As camadas existentes para esse serviço são:

  • Básica
  • Standard
  • Premium

Clique aqui para mais informações sobre o Azure Service Bus.

Criando uma instância do serviço no Azure

Primeiramente, acessamos o portal do Azure, logamos e abrimos o menu lateral.

 Selecionamos “Create a Resource” e na página da busca seguinte colocamos “Azure Service Bus”.

Buscando o Azure Service bus no Marketplace

Ao acessar o primeiro item da imagem, “Azure Service Bus”, somos levados para a tela de detalhes do serviço. Clicamos então em “Create”.

Service Bus no Marketplace do Azure

Somos direcionados para a tela de preenchimento de informações. POR FAVOR, usem a camada Basic para testes. Por experiência própria, você não vai querer testar com a Premium. Vai que você esqueça… Não que isso já tenha ocorrido comigo…

Criando o namespace do Service Bus

Clique em “Review + create”, e então em “Create”. Agora só resta aguardar pela publicação do serviço.

Feito isso, o último passo é obter a Connection String, que será utilizada em nossa aplicação. Para isso, acesse o item de menu “Shared access policies”, sob a categoria “Settings”. Selecione a opção existente “RootManagerSharedAccessKey”, aguarde um pouco, e as chaves à direita aparecerão. Guarde a “Primary Connection String” em um lugar seguro (nesse exemplo vou usar o appSettings.json para armazenar, embora não suba a minha chave no Git).

Chaves do namespace do Service Buz

Agora é hora de criar uma fila a ser utilizada por nossa aplicação posteriormente.

Criando a fila

Agora estando na página do recurso criado “notifications-servicebus”, acessamos o item “Queues”, que está na categoria “Entities”. Na janela que abrir à direita clicamos em “+ Queue”, e uma janela será aberta no extremo direito. 

Para simplificar, somente preenchemos o campo Name, e deixamos o resto como valor padrão.

Criando a fila no Service Bus

Com nossa fila criada, é hora de ir para o código!

Fila criada no Service Bus

Integrando com ASP NET Core

Nessa parte 1, como comentado anteriormente, é chegar ao ponto de enviar uma mensagem para a fila. O nome da fila a ser utilizada é “email-queue”. O projeto a ser utilizado é um ASP NET Core, com o template API.

Instalando os pacotes necessários

O pacote necessário para realizar o envio da mensagem ao Azure Service Bus é o Microsoft.Azure.ServiceBus. Para o exemplo será utilizado também o pacote Newtonsoft.Json

Abaixo está o código para instalar o pacote via dotnet CLI.

Adicionando os pacotes para o projeto

Se preferir utilizar o NuGet, basta buscar pelo pacote de mesmo nome lá.

Vamos ao código para publicar uma mensagem!

Publicando uma mensagem

A idéia é criar uma API para simular um “Follow” de rede social. Existiria um endpoint para a submissão de dados de uma ação de seguir, contendo dados de usuário seguidor, quem está sendo seguido, e a data. 

Aqui abaixo está a classe usada como modelo de entrada dos dados. Normalmente, as propriedades FollowedAt e Email seriam preenchidas no servidor, e não passadas diretamente no modelo de dados de entrada. O e-mail, por exemplo, poderia ser consultado de um banco de dados baseado no identificador do usuário que está sendo seguido.

Modelo de entrada para a API

A classe a ser utilizada para a conexão e envio de mensagens para a nossa fila é a QueueClient, do namespace Microsoft.Azure.ServiceBus. Instanciamos ela passando o Connection String, obtido anteriormente, que está armazenado no arquivo de configuração do appSettings.json.

O exemplo é composto por um Controller chamado FollowersController, com umendpoint HTTP POST.

Controller com o endpoint de acesso a API

Como a imagem mostra, eu recebo o objeto de entrada a partir do corpo da requisição, e serializo ele para uma string com conteúdo em formato JSON. Após isso, converto ela em um array de bytes, e instancio a classe Message, do namespace Microsoft.Azure.ServiceBus passando esse array como parâmetro. Finalmente, chamo o método SendAsync do QueueClient, que envia a mensagem usando a fila e configurações especificadas no construtor do Controller.

Testando

Usando o Postman, preparamos e enviamos a requisição com um objeto JSON no corpo dela, recebendo na resposta um status 200 OK.

Requisição no Postman

Na Parte 2 veremos como consumir essa mensagem e obter o objeto enviado! Além disso, apresentarei um extra: integração com o SendGrid (que apresentei neste artigo) e envio de e-mails de notificação junto ao consumo da mensagem, simulando um caso mais próximo à realidade.


Inscreva-se na lista de espera do Método .NET Direto ao Ponto, um treinamento completo sobre C#, APIs com ASP.NET Core e Microsserviços:  Inscreva-se aqui.

São quase 200 vídeo-aulas sobre temas como C#, ASP NET Core 5, EF Core, CQRS, Clean Architecture, Autenticação e autorização com JWT, Testes Unitários, além de mini-cursos em Microsserviços, Performance em .NET, ASP NET Core e Azure, Docker, Carreira Internacional em .NET, e mais.


Conclusão

Nesse artigo foram apresentados os principais conceitos de mensageria e suas vantagens. Além disso, foi feita a apresentação do Azure Service Bus e suas características principais, além de um passo-a-passo de criação de um recurso desse tipo no Microsoft Azure e uma fila. Finalmente, foi feita a implementação de um endpoint em um projeto ASP NET Core onde é feita a conexão e envio de uma mensagem para a fila criada anteriormente.

Confira a parte 2

Se gostou, agradeço se puder compartilhar e/ou dar seu feedback!

Até o próximo artigo!