Mensageria na nuvem com RabbitMQ, .NET Core e Azure Functions

Renato Groffe
5 min readMar 2, 2020

--

Uma dúvida bastante recorrente entre aqueles que optam pelo Microsoft Azure para a implementação de soluções na nuvem é quanto ao suporte oferecido ao uso de RabbitMQ. Como trabalhar com esta que é atualmente uma das soluções de mensageria?

Temos algumas opções para a criação de ambientes baseados no RabbitMQ no próprio Portal do Azure, como demonstrado na imagem a seguir:

Existe ainda a possibilidade de configurarmos em produção a utilização do RabbitMQ em um cluster Kubernetes, com isto acontecendo por meio do AKS (Azure Kubernetes Service).

Mas e no que diz respeito à implementação de aplicações que processarão as mensagens enviadas a uma fila/queue do RabbitMQ?

Até recentemente o melhor caminho para isto seria a implantação de uma aplicação em uma máquina virtual ou, até mesmo, a execução desta em um container criado com o Azure Container Instances ou via cluster Kubernetes.

A grande novidade agora está no fato de que poderemos também trabalhar com RabbitMQ a partir de aplicações baseadas em Azure Functions, abrindo caminho assim para a implementação de soluções em arquitetura serverless com um custo reduzido. Entranto, é necessário ressaltar que o package para .NET Core ainda se encontra em versão Beta no momento da publicação deste artigo (início de Março/2020).

O anúncio sobre o suporte a RabbitMQ está descrito no seguinte post:

Neste artigo trago um exemplo simples de uso de RabbitMQ em uma Function App, através da implementação de um projeto Serverless utilizando .NET Core, Azure Functions 3.x e o Azure SQL/SQL Server na manipulação de cotações de moedas estrangeiras.

Para ficar por dentro das novidades do Azure Functions 3.x acesse o artigo a seguir:

.NET Core 3.x + Serverless: configuração, dicas e exemplos com Azure Functions 3.x

E aproveito este espaço para deixar aqui um convite.

Que tal aprender mais sobre Docker, Kubernetes e a implementação de soluções baseadas em containers utilizando o Microsoft Azure, em um workshop que acontecerá durante um sábado (dia 04/04/2020) em São Paulo Capital e implementando um case na prática?

Acesse então o link a seguir para efetuar sua inscrição (inclui camiseta, emissão de certificado e almoço para todos os participantes) com desconto:
http://bit.ly/anp-docker-blog-groffe

Implementando a Function App

A aplicação detalhada nesta seção é uma variação do seguinte projeto:

.NET Core + Azure Functions 3.x + Queue Storage + Azure SQL/SQL Server + Queue Trigger + HTTP Trigger

Detalhes sobre a criação de Function Apps a partir do Visual Studio Code podem ser encontrados no artigo:

.NET Core + Serverless: implementando jobs com Azure Functions e o VS Code

Será necessário incluir no novo projeto o package Microsoft.Azure.WebJobs.Extensions.RabbitMQ, utilizando para isto uma de suas versões Beta compatíveis com Azure Functions 3.x:

dotnet add package Microsoft.Azure.WebJobs.Extensions.RabbitMQ -v 0.2.2029-beta

Adicionar ainda a biblioteca Dapper:

dotnet add package Dapper

E o novo provider de acesso a dados do .NET Core 3.x para bases do SQL Server/Azure SQL:

dotnet add package Microsoft.Data.SqlClient

No arquivo local.settings.json estarão as strings de conexão para o SQL Server (BaseCotacoes) e o RabbitMQ (BrokerRabbitMQ):

Teremos neste projeto a classe Cotacao representando uma cotação de moeda estrangeira

Um HttpTrigger implementado pelo tipo CotacoesHttpTrigger, o qual permitirá consultas ao valor de cotação mais recente para uma moeda (definidos na tabela dbo.Cotacoes):

E finalmente na classe MoedasRabbitMQTrigger estará o código que define a Function de mesmo nome, estrutura essa responsável por processar mensagens direcionadas a uma fila do RabbitMQ:

  • No atributo RabbitMQTrigger foi indicada a fila (queue-cotacoes), bem como a string de conexão ao broker do RabbitMQ (BrokerRabbitMQ);
  • Temos ainda a utilização do novo serializador JSON do .NET Core 3.x (linha 19), bem como do novo provider de acesso a bases SQL (linhas 5 e 24).

O código deste projeto já se encontra no GitHub:

https://github.com/renatogroffe/DotNetCore-AzureFunctions3x-RabbitMQ-Moedas

Testes

Para a criação de um ambiente de testes com RabbitMQ utilizei a tag/versão 3-management-alpine da imagem oficial do RabbitMQ no Docker Hub (chamada rabbitmq) e o Azure Container Instances. A string de conexão foi alterada, a fim de apontar para o broker representando por este recurso do Azure Container Instances.

Uma Function App chamada groffemoedas também foi criada:

O deployment das Azure Functions detalhadas na seção anterior aconteceu por meio do próprio Visual Studio Code:

Caso queira conhecer mais sobre a publicação no Microsoft Azure de uma Function App acesse:

.NET Core + Serverless: publicando uma Azure Function via VS Code

Criei para os testes uma Console Application chamada CargaMoedasRabbitMQ, a qual também já foi disponibilizada no GitHub:

https://github.com/renatogroffe/DotNetCore3.1-RabbitMQ-CargaCotacoes

Ao executar via PowerShell o primeiro teste da Console Application poderemos constatar que a cotação é processada pela Function App publicada no Azure:

Enviando uma requisição à função HttpTrigger teremos como resultado:

Na imagem a seguir temos o segundo teste da Console Application, com o processamento da mensagem correspondente:

Já a função HttpTrigger trará como resposta:

--

--

Renato Groffe

Microsoft Most Valuable Professional (MVP), Multi-Plataform Technical Audience Contributor (MTAC), Software Engineer, Technical Writer and Speaker