Um fato interessante sobre o desenvolvimento de aplicações é que em poucas ocasiões elas irão funcionar sozinhas e isoladas de outras aplicações.
E saber que a utilização de sistemas distribuídos está influenciando cada dia mais o norte do desenvolvimento de novas aplicações, e que mesmo nas aplicações legadas e monolíticas é necessário pensar em como será o reaproveitamento e a integração com essas novas aplicações. Logo a forma como será construída a integração pode interferir positivamente ou negativamente no resultado do projeto.
Historicamente existem algumas soluções já adotadas pelo mercado para realizar essas integrações, sendo elas: banco de dados compartilhado, transferência de arquivos, invocação remota de procedimento (RPC) e mensageria.
Cada uma dessas possui vantagens e desvantagens, este artigo é sobre a utilização de mensageria, mais especificamente sobre a funcionalidade do Microsoft Azure chamada Service Bus, que é um sistema genérico de mensagens desenvolvido pela Microsoft.
Atualmente, com a popularização dos dispositivos móveis e a famosa internet das coisas, muitos desenvolvedores estão começando a escrever suas aplicações distribuídas pensando em utilizar algum sistema com o foco em fila de mensagens e processamento assíncrono, e isto traz como benefício justamente a capacidade de escalabilidade horizontal e uma manutenção mais simples para o projeto, além da capacidade de dimensionar as cargas de trabalho mais facilmente, facilitando assim a construção de novos recursos.
Toda essa vantagem para a condução do projeto está em colocar uma camada intermediaria entre duas ou mais aplicações, na qual a primeira aplicação apenas cria uma mensagem e coloca na fila, fazendo com que a primeira aplicação não conheça o funcionamento interno e nem acompanhe o fluxo do processo da segunda aplicação.
A segunda aplicação é responsável pelo processamento da mensagem, e se for necessário responder de volta a primeira aplicação, é gerada outra mensagem com o resultado do processamento e esta é colocada em uma outra fila.
Benefícios da mensageria
Pode parecer confuso em um primeiro contato com essa abordagem, mas isso está alinhado com o que a computação em nuvem prega. Podemos ter, em um determinado instante, uma instância da aplicação A e cinco da aplicação B, e em outro instante três instâncias da aplicação A e dez da aplicação B.
As filas de mensagens atuam como laços com a função de amarrar essas aplicações. É possível identificar os seguintes benéficos dessa abordagem:
Baixo acoplamento: é extremamente complicado prever qual o escopo que o projeto irá adquirir. Porém com a introdução dessa camada intermediária entre as aplicações, e definindo uma interface comum para a comunicação, é possível estender essas aplicações de forma independente, sendo que a única premissa é obedecer à interface comum da mensagem.
Redundância: uma característica das filas de mensagens é a capacidade de manter a mensagem na fila até que ela seja processada. É possível que uma falha transiente impeça que a mensagem possa ser processada corretamente, sendo assim, é possível que o sistema de mensageria mantenha uma cópia da mensagem e tente novamente em um outro momento futuro.
Escalabilidade: sabendo que as mensagens estão armazenadas em um sistema intermediário, e se houver a necessidade de expandir a capacidade de vasão da fila, é muito simples adicionar uma nova instância de consumidor, fazendo com que mais mensagens sejam processadas em um menor espaço de tempo.
Sem a necessidade de mudar algum trecho de código, ou alterar algum arquivo de configuração, sendo simplesmente um processo de copiar a aplicação e subir em um novo processo.
Resiliência: a resiliência é a capacidade de resistir a momentos de falhas, e não deixar de entregar uma resposta ao usuário. Uma parte da aplicação pode falhar, mas isso não irá deixar toda a sua aplicação inoperante.
Esse cenário para as filas de mensagens seria o equivalente a dizer que se a aplicação B ficar indisponível, a aplicação A não será afetada, e as suas mensagens ficarão armazenadas na fila até que a aplicação B recupere o funcionamento normal, e como existe uma quantidade de mensagens anormal na fila, é possível criar novas instâncias da aplicação B, visando recuperar o tempo perdido com a indisponibilidade parcial da solução.
Garantia de ordenamento: em diversas ocasiões é necessário garantir que o processamento das mensagens obedeça a uma determinada ordem. E esse ordenamento é intrínseco ao sistema de fila.
Comunicação assíncrona: existem ocasiões em que é interessante definir um horário especifico para o processamento da mensagem. Por esse motivo as filas de mensagens permitem que sejam definidos os horários de processamento das mensagens, permitindo que seja colocada uma mensagem na fila e o seu processamento ser adiado para um outro momento futuro.
Service Bus
Service Bus é o segundo serviço de mensagens em fila liberado pelo time do Microsoft Azure, historicamente falando, sendo que além da fila essa plataforma oferece ainda tópicos, retransmissão, hubs de eventos e um outro tipo de namespace chamado hub de notificação que não está no escopo deste artigo.
Este serviço é rico em recursos e maduro o suficiente para prover um meio de desacoplamento de sistemas para troca de informações de forma independente.
O Service Bus pode ser hospedado no Microsoft Azure ou dentro da sua infraestrutura local.
Para contextualizar esse serviço dentro dos modelos de serviço para computação em nuvem, podemos definir como um PaaS (Platform as a Service, ou Plataforma como um Serviço), podendo ser tão simples como uma fila ou tão complexo como fluxo de trabalho com um número gigantesco de filas interconectadas. Segue uma descrição das funcionalidades do Service Bus:
Filas: atua como
intermediário (broker) entre o produtor da mensagem e o receptor da mensagem,
uma de suas principais características é implementar a estrutura FIFO
(First-In-First-Out, ou seja, Primeiro a Entrar, Primeiro a Sair), oferecendo
um modelo de um para um, isto ...