Azure Service Bus - Aprimorar capacidade de resposta das suas aplicações. Parte 1.

Recentemente tivemos o evento Global Integration Bootcamp 2020 promovido pela Microsoft, afim de compartilhar conhecimento entre os times que utilizam seus produtos.

A CloudMotion realizou neste ano esse evento e tive o privilégio de falar sobre o serviço de mensageria na nuvem, o Azure Service Bus.

Conceito

Quando suas aplicações não estão conseguindo responder a tempo ou deixam de responder a seus clientes, é o momento de pensar em escalar, dando capacidade de resposta (Digo até que este é um passo inicial no processo de arquitetura da sua aplicação). Uma técnica que vem sendo cada vez mais utilizada, é o uso de mecanismos de mensagem e filas. E vou trazer os principais aspectos para que você tenha uma visão para poder aplicar na arquitetura de seus sistemas.

Alguns Cenários Comuns. Porque utilizar o Azure Service Bus?

  • Poder escalar a aplicação e evitar overhead de processamento.
  • Poder ter alta disponibilidade e garantir o envio/recebimento com operações síncronas/assíncronas.
  • Poder ser distribuído. Comunicar com outras aplicações.
  • Poder ser mais seguro. Definição de políticas de autorização e acesso ao conteúdo da mensagem.
  • Com a infraestrutura na nuvem, não se preocupar com Backup, Disaster Recovery e disponibilidade do serviço.
  • Não depender de um infraestrutura On-Premises que precisa ser gerenciada, se preocupar com gerenciamento de servidores, disponibilidade, backup, etc.

Exemplo de um cenário comum

Vamos pegar o cenário de uma aplicação que realiza o gerenciamento de reservas para aluguéis de veículos. Nela temos as seguintes funcionalidades:

  • Precisa receber os pedidos do cliente, que efetua a reserva do veículo.
  • Precisa notificar o cliente sobre os veículos disponíveis, reservas efetuadas ou não com sucesso. Outras mensagens: Promoções, ofertas, multas, etc.
  • Não depender do pool de conexões do gerenciador do site. (IIS, Apache, etc).
  • O cliente escolhe quais serviços deseja se inscrever para recebimento de informações.
Modelo deste cenário:

Modelo Cenário Comum
Modelo Cenário Comum (clique para ampliar)
Modelo deste cenário com Azure Service Bus:

Modelo Cenário Service Bus
Modelo Cenário Service Bus (clique para ampliar)
Modelo Macro - Azure Service Bus:

Modelo Macro Cenário Service Bus
Modelo Macro Cenário Service Bus (clique para ampliar)
Modelo de Integração - Azure Service Bus:

Modelo Integração Service Bus
Modelo Integração Service Bus (clique para ampliar)
  • Mensagem (Corpo): JSON

Namespaces

É um contêiner para todos os componentes de mensagem. Vários tópicos e filas podem estar em um único namespace e os namespaces geralmente servem como contêineres de aplicativos.

Queues

As mensagens são enviadas e recebidas a partir de filas. As filas armazenam mensagens até que o aplicativo de recebimento esteja disponível para recebê-las e processá-las. As mensagens em filas são ordenadas e recebem carimbo de data/hora na chegada. Quando aceita, a mensagem é mantida protegida em armazenamento com redundância. As mensagens são entregues em modo pull, e somente quando solicitado.

Queue Service Bus
Queue Service Bus (clique para ampliar)

Topics

Também é possível usar tópicos para enviar e receber mensagens. Enquanto uma fila é frequentemente usada para comunicação ponto a ponto, os tópicos são úteis em cenários de publicação/assinatura.

Topics Service Bus
Topics Service Bus (clique para ampliar)

BrokeredMessage

Estrutura que possui propriedades que definem a característica da mensagem a ser transmitida.

Principais propriedades:

  • Body: Corpo da mensagem. Seu conteúdo.
  • ContentType: Tipo do conteúdo. Exemplo: application/json
  • Label: Uma forma amigável de identificação da mensagem
  • LockTocken: Token associado a mensagem.
  • MessageId: Id da mensagem definida pelo usuário.
  • State: Identifica qual o estado da mensagem.
  • TimeToLive: Quanto tempo a mensagem irá ficar armazenada após expirar. Após esse tempo, ela não poderá ser recuperada.

Principais métodos:

  • CompleteAsync() – Indica que a mensagem foi recebida e a marca para exclusão.
  • AbandonAsync() – Se houver uma operação cancelada, utilize para cancelar o lock da mensagem.
  • DeadeLetterAsync() – Move a mensagem para um outra fila de mensagens descartadas.
  • Clone() – Copia a mensagem, permitindo enviar como uma nova mensagem.

Segurança

Apresento alguns recursos disponíveis para proteger suas informações:

  • Authentication / Authorization:
    • SAS Token: Define as permissões para a entidade. (Namespace, Queue, Topics)
    • Azure AD (RBAC – Role based access control). Sem necessidade de armazenar credenciais na aplicação. Até mesmo as permissões SAS podem ser gerenciadas pelo Azure AD.
    • Oauth 2.0. Acesso por token. Precisa registrar a aplicação com Azure AD tenant e ter o id de cliente.
  • Geo Outage/Disaster Recovery: Quando um datacenter ou região apresentar instabilidade, o Azure replica para outra, para manter os serviços funcionando. Em casos de desastre natural, pode ser que nem todos os dados possam ser recuperados.

  • Storage: Dados armazenados no Azure Storage e SQL Azure.

Recursos Avançados

  • Message Sessions: Usa o modelo FIFO(First-in, First-out) para garantir a entrega ordenada das mensagens.
  • Autoforwarding: Encaminha mensagens para outras filas e tópicos.
  • Dead-letter: Mensagens que não puderem ser processadas, devido a uma exceção de aplicação ou serviços. São armazenadas numa sub-queue (DLQ) para inspeção do ocorrido.
  • Scheduled delivery: Podemos dizer em que momento a mensagem será processada. Podem ser canceladas antes de serem enviadas e a mensagem é removida.
  • Message deferral: Adiar o processamento da mensagem por algum tempo devido uma necessidade da aplicação. Como workflows e dependências de regras de negócio. A mensagem é posta em processo paralelo até sua execução.
  • Transactions: Suporta a execução de operações dentro de um escopo. Suporta agrupamento dessas operações, como se fosse uma única mensagem. Pode ser uma queue, topic ou subscription.
    • Exemplo: using (var ts = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
  • Filtering and actions: Nas subscrições, podemos filtrar o que queremos ver. Filtros booleanos, correlacionados (olhando propriedades da mensagem) e Notação SQL.
    • Exemplo: sys.To NOT IN ('Store1','Store2')
  • Duplicate detection: Detecta mensagens duplicadas (MessageId) e as descarta, enviando somente uma ao solicitante.

Bom, esta é a Parte 1 que traz mais os conceitos e recursos sobre o Azure Service Bus e em breve trarei a parte 2 com um exemplo funcional, consumindo as filas e tópicos de um namespace.

Obrigado! Até a próxima!

Lucas Rocco Ferreira - Consultor Cloud & Devops



27/04/2020 | Por Lucas Rocco Ferreira | Em Técnico | Tempo de leitura: 5 mins.

Postagens relacionadas