Azure Service Bus — Entendendo seu funcionamento — Parte 1

Atualizado em 14/05/2022
No tópico de hoje, vamos nos aprofundar no conceito de mensageria, entender os benefícios e mostrar como o Azure Service Bus, um serviço de mensageria da Microsoft, tem facilitado essa tarefa.
O que é Mensageria?
Mensageria é uma forma de comunicação assíncrona entre aplicações na qual a comunicação é realizada por meio de mensagens. Nesse modelos temos os produtores de mensagens, os consumidores dessa mensagem e a fila (Message Broker) intermediando essa comunicação.
O que são Mensagens?
Uma mensagem é uma estrutura de dados composta por metadados como host de origem/destino, fila de destino, além de dados em formato JSON, XML ou apenas texto informando os dados a serem persistidos ou processados, como por exemplo um produto ou cliente a ser cadastrado.
Produtor de Mensagem (Publisher)
É o responsável por incluir cada nova mensagem na fila, ou seja enviar a mensagem

Consumidor de Mensagem (Consumer)
Como diz o próprio nome é o agente responsável por consumir, retirar a informação da fila

Porque utilizar Mensageria
Abaixo vamos abordar alguns dos mais importantes benefícios que a mensageria traz para nossas aplicações
Desacoplamento
As aplicações não precisam estar online ao mesmo tempo para ocorrer a comunicação, ou seja, a mensagem pode ser emitida em uma determinada hora e ser consumida em outra, com isso temos um funcionamento desacoplado onde cada módulo é independente.
Responsividade
As mensagens dão um ar um pouco mais responsivo para nossas aplicações, ou seja, em um determinado fluxo, pode haver muitas tarefas para serem realizadas e com isso não obrigamos o usuário a ficar esperando até que tudo seja feito. Um exemplo desse funcionamento é quando é feito um pedido em uma loja virtual e o processamento do pagamento demora alguns segundos ou minutos para ser efetivado.
Escalabilidade
Esse é um dos maiores benefícios que o sistema de mensageria traz para nossa aplicação pois fornece um maior desempenho. Imagine que nossa aplicação tenha uma explosão de processamento a realizar, com isso a chance da nossa aplicação sofrer uma sobrecarga é bem grande, comprometendo o desempenho geral.
Com o sistema de mensageria, cada mensagem representa uma tarefa a ser processada pelo módulo de destino e o mais interessante é que podemos escalar isso, ou seja, podemos ter uma, duas ou N instâncias realizando processando em paralelo das mensagens que chegam na fila, com isso aumentamos a capacidade de processamento do nosso software como um todo.
Um exemplo disso é no dia da Black Friday, onde os sistemas possuem picos de trabalhos gigantescos diferentemente de outros dias do ano e com a mensageria, aumentamos a capacidade de processamento.
Azure Service Bus
O Microsoft Azure Service Bus é um mediador de mensagens totalmente gerenciado, confiável e segura para transferência assíncrona de dados.
No azure Service Bus, podemos usar filas e tópicos para envio e recebimento de mensagens, além de trabalhar com o conceito FIFO.
FIFO (first-in, first-out)
Conforme documentação oficial, o Azure Service Bus utiliza o conceito de FIFO (first-in, first-out), ou seja, a primeira mensagem que chegar é a primeira a sair.
Fila
Seguindo a proposta de uma fila comum mesmo, conforme nossas mensagens chegam no Service Bus, serão enfileiradas e enviadas. Abaixo você tem uma imagem demonstrando esse passo:

Tópico
O funcionamento do tópico se assemelha com a fila, porém uma diferença é que um tópico, pode ter assinaturas independentes, ou seja, um assinante de um tópico pode receber uma cópia de cada mensagem enviada para esse tópico.
Para entender melhor, cada tópico é responsável por determinado assunto, ou seja, o tópico A pode ter o nome “Produto” e receber apenas mensagens referentes a produtos enquanto o tópico B pode receber apenas mensagens de clientes e assim por diantes. Com isso as aplicações podem se inscrever para receber uma mensagem conforme o seu propósito.
A imagem abaixo exemplifica esse passo:

Processamento de Mensagem
Existem duas maneiras pelas quais um destinatário receberá uma mensagem: Peek and Lock e Receive and Delete
Peek and Lock
Nesse modo, a mensagem é bloqueada pelo destinatário por uma duração especificada pela propriedade “Duração do Bloqueio” da Fila ou, em outras palavras, nesse modo, uma mensagem é ocultada de outros receptores por um período especificado pela Duração do Bloqueio. O destinatário processaria a mensagem e, depois disso, o destinatário marcaria a mensagem como “Concluída”, que basicamente exclui a mensagem da fila. Se a “Duração do bloqueio” expirar, outros receptores poderão buscar esta mensagem
Receive and Delete
Nesse modo, uma vez que a mensagem é recebida por um destinatário, ela será excluída da fila automaticamente. Se um receptor falhar ao processar essa mensagem, a mensagem será perdida para sempre. Portanto, use este modo com cuidado.
Criando o Azure Service Bus Queue
Acesse portal do Azure e realize o login e na barra de pesquisa do painel digite Azure Service Bus e em seguida clique na opção Service Bus, conforme indica a imagem abaixo

Você será redirecionado para uma página que lista todos os serviços de mensageria, porém como não possuimos nenhum, vamos ter que criar um serviço e para isso clique em Add

Na próxima tela, vamos de fato, informar todas as informações para criação do serviço, conforme imagem

Nessa página, devemos obrigatóriamente informar a subscription e o resource group (caso não possua um resource group, clique na opção logo abaixo do dropdown para criar um)
Além dessa informações, devemos infomar algumas outras:
- Namespace name: Nome a ser dado para a mensageria
- Location: É a localização onde nossos arquivos ficarão hospedados e você pode escolher o lugar de sua preferência (aconselho a utilizar o servidor do Brasil para evitar a latência)
- Pricing tier: É a camada de preço do serviço (Basic, Standard, Premium). No caso, vamos escolher a camada Standard que possui suporte tanto a fila como tópico.
Após preencher as informações, podemos clicar em Review + create para prosseguir com a criação

O Azure validará todas as informações fornecidas no passo anterior, informando seu resultado e com isso podemos clicar em Create para finalmente criar noss serviço.
Será necessário aguardar alguns segundos ou até minutos para que o Azure finalize o processo de criação.

Após o término do processo, clique em Go to resource para acessar o serviço

Para criação de uma fila simples clique em + Queue, onde será redirecionado para uma janela onde forneceremos as informações para a criação da fila

Nessa etapa, devemos informar as seguintes informações:
- Name: Nome a ser dado para a fila do Azure Service Bus
- Max queue size: Tamanho máximo da fila
- Message time to live: Quantidade de dias que a mensagem ficará na fila aguardando para ser processada. Se a mensagem não for processada, ela pode ser removida ou enviada para uma fila de mensagens não processadas (dead letter)
- Lock Duration: Tempo de duração que uma mensagem ficará alocada para um consumidor processar, uma vez recebida, nenhum outro consumidor pode recebe-la
- Enable duplicate detection: Configura a fila (queue) para manter um histórico de todas as mensagens por um período configurável. Durante esse intervalo, sua fila não aceitará nenhuma mensagem duplicada. A ativação dessa propriedade garante a entrega exata apenas uma vez, durante um período de tempo definido pelo usuário.
- Enable dead lettering on message expiration: Indica se as mensagens na fila devem ser movidas para a sub-fila de mensagens não entregues quando expirarem. Se essa propriedade não estiver configurada, as mensagens serão removidas da fila assim que expirarem.
- Enable sessions: Com as sessões ativadas, uma fila pode garantir a entrega de mensagens no modo first-in-first-out
- Enable partitioning: Indica se a fila deve ser particionada entre vários message broker (Azure Service Bus).
Para o nosso cenário, vou manter todas as informações que vem default, porém sinta-se a vontade de configurar do seu jeito.
Após fornecer todas as informações, clique em Create e aguarde alguns segundos até o processo de criação concluir


Aqui finalizamos a criação da fila, agora ela está pronta para ser utilizada, porém antes de seguirmos para o código, vamos entender como que funciona a criação de um tópico.
Azure Service Bus Topic
Voltando na tela principal do Service Bus, clique na opção + Topic, onde será redirecionado para uma janela onde forneceremos as informações para a criação do tópico.

As informações da tela abaixo foram explicadas na criação da fila, caso tenha dúvidas, vale a pena conferir novamente.
Com as informações preenchidas clique em Create, para prosseguir com a criação do nosso tópico

Finalizado a criação, agora possuímos tanto um tópico como uma fila, conforme vemos na imagem abaixo

Vamos agora configurar as subscription e para isso clique no nome do tópico e na próxima tela clique em + Subscription

Precisamos fornecer algumas informações para a criação da nossa subscription

As informações dessa tela, foram explicadas quando criamos nosso Service Bus Queue, porém duas informação importante nova esta presente nessa tela
- Max delivery count: Indica o número máximo de vezes que uma mensagem pode ser entregue. Depois que essa contagem exceder, a mensagem será removida da fila
- Forward messages to queue/topic: Encaminhar automaticamente mensagens para uma fila ou tópico no mesmo namespace
Prosseguindo nossa configuração, clique no Create para finalizar a criação da nossa subscription e agora refaça novamente todo o processo novamente para a criação da nossa segunda subscription.

Com toda a configuração da nossa mensageria finalizada, temos uma fila (queue) simples com o nome “product” e um tópico (topic) com o nome “product-topic” com duas subscription “product-sub1” e “product-sub2”.
No próximo post vamos demonstrar a implementação dos consumers e publishers em C#
Ficou com dúvida? Deixe nos comentários