Escolher uma plataforma de mensagens
Há uma série de plataformas de comunicação disponíveis para ajudar a melhorar a confiabilidade de um aplicativo distribuído, várias delas do Microsoft Azure. Cada plataforma é uma ferramenta que atende a uma finalidade diferente. É importante escolher a ferramenta certa para cada requisito em seu aplicativo. Dê uma olhada em suas opções no Barramento de Serviço do Azure.
A arquitetura distribuída proposta para o aplicativo de pedidos e rastreamento da Contoso Bicycles exige vários componentes, incluindo um site, armazenamento de dados e um serviço de back-end. Você pode associar os componentes do nosso aplicativo de várias maneiras diferentes e um único aplicativo pode aproveitar várias técnicas.
Você precisa decidir quais técnicas usar no aplicativo da Contoso Bicycles. A primeira etapa é avaliar cada local em que há comunicação entre múltiplas partes. Alguns componentes precisam ser executados de maneira oportuna para que nosso aplicativo consiga fazer seu trabalho. Alguns podem ser importantes, mas não críticos. Por fim, outros componentes, como notificações de aplicativo móvel, são um pouco mais opcionais.
Escolher entre mensagens e eventos
Mensagens e eventos são datagramas: pacotes de dados enviados de um componente para outro. Eles são diferentes de maneiras que a princípio parecem sutis, mas as diferenças podem se tornar significativas conforme você arquiteta seu aplicativo.
Mensagens
Na terminologia dos aplicativos distribuídos, a característica definidora de uma mensagem é que a integridade geral do aplicativo pode depender do recebimento de mensagens. Você pode imaginar que o envio de uma mensagem é como um componente passando a tarefa do fluxo de trabalho para outro diferente. O fluxo de trabalho inteiro pode ser um processo comercial vital, e a mensagem é a argamassa que mantém os componentes unidos.
Em geral, uma mensagem contém os dados em si, não apenas uma referência (como ID ou URL) a eles. Enviar os dados como parte do datagrama é menos frágil do que enviar uma referência. A arquitetura de mensagens garante a entrega da mensagem e, como não são exigidas pesquisas adicionais, a mensagem é tratada de forma confiável. No entanto, o aplicativo de envio precisa saber exatamente quais dados devem ser incluídos para evitar o envio de muito dados, o que faria com que o componente fizesse um trabalho desnecessário. Nesse sentido, o remetente e o destinatário da mensagem geralmente são acoplados por um contrato de dados estrito.
Na nova arquitetura da Contoso Bicycles, quando um pedido é feito, a empresa provavelmente usará mensagens. O front-end da Web ou aplicativo móvel enviará uma mensagem aos componentes de processamento de back-end. No back-end, etapas como direcionamento para a loja mais próxima do cliente e cobrança em um cartão de crédito ocorrerão.
Eventos
Um evento dispara uma notificação de que algo ocorreu. Os eventos são “mais leves” do que as mensagens e geralmente são usados para comunicações de difusão.
Os eventos têm as seguintes características:
- O evento pode ser enviado a vários receptores ou a nenhum.
- Geralmente, os eventos são destinados a “fan-out” ou têm um grande número de assinantes de cada publicador.
- O editor de eventos não tem nenhuma expectativa sobre a ação que um componente receptor executa.
Uma rede de lojas de peças de bicicletas provavelmente utilizaria eventos para notificações de usuários sobre alterações de status. Os eventos de alteração de status podem ser enviados para a Grade de Eventos do Azure, depois para o Azure Functions e para os Hubs de Eventos do Azure para uma solução completa sem servidor.
Essa diferença entre eventos e mensagens é fundamental, porque as plataformas de comunicação geralmente são criadas para lidar umas com as outras. O Barramento de Serviço foi projetado para lidar com mensagens. Se você deseja enviar eventos, provavelmente escolherá a Grade de Eventos do Azure.
O Azure também tem os Hubs de Eventos do Azure, mas que geralmente é usado para um tipo específico de stream de alto fluxo de comunicação usado para análise. Por exemplo, se você tivesse sensores em rede em seus armazéns de fabricação, você poderia usar os Hubs de Eventos juntamente com o Azure Stream Analytics para observar padrões nas mudanças de temperatura que possam indicar um incêndio ou desgaste de componentes.
Tópicos e filas do Barramento de Serviço
O Barramento de Serviço do Azure pode trocar mensagens de duas maneiras diferentes: filas e tópicos.
O que é uma fila?
Uma fila do Barramento de Serviço é um local de armazenamento temporário simples para mensagens. Um componente de envio adiciona uma mensagem à fila. Um componente de destino pega a mensagem que está no início da fila. Em circunstâncias normais, cada mensagem é recebida apenas por um único receptor.
As filas separam os componentes de origem e de destino para isolar os componentes de destino da alta demanda.
Durante os horários de pico, as mensagens podem chegar mais rápido do que os componentes de destino podem tratar. Como nossos componentes de origem não têm conexão direta com os de destino, o código-fonte não é afetado e a fila aumentará. Os componentes de destino removerão mensagens da fila à medida que forem lidando com elas. Quando a demanda é removida, os componentes de destino podem recuperar o atraso e a fila diminui.
Uma fila responde à alta demanda sem a necessidade de adicionar recursos ao sistema. No entanto, no caso de mensagens que precisam ser entregues rapidamente, é possível criar mais instâncias do componente de destino, a fim de que elas compartilhem a carga. Cada mensagem é tratada por apenas uma instância. Isso é uma forma eficiente de dimensionar seu aplicativo inteiro com a adição de recursos apenas aos componentes que realmente precisam deles.
O que é um tópico?
Um tópico do Barramento de Serviço é semelhante a uma fila, mas um tópico pode ter várias assinaturas. Isso significa que vários componentes de destino podem assinar um tópico específico, de modo que cada mensagem será entregue para vários destinatários. As assinaturas também podem filtrar as mensagens no tópico para receber apenas as mensagens relevantes. As assinaturas fornecem as mesmas comunicações separadas como filas e respondem às altas demandas da mesma forma. Use um tópico caso você queira que cada mensagem seja entregue a mais de um componente de destino.
Observação
Não há suporte para Tópicos no tipo de preço Básico.
Filas do Barramento de Serviço e filas do armazenamento
Dois serviços do Azure incluem filas de mensagens: Barramento de Serviço e Armazenamento do Azure. Como um guia geral, as filas de armazenamento são mais simples de usar, mas são menos sofisticadas e menos flexíveis do que as filas do Barramento de Serviço.
As principais vantagens das filas do Barramento de Serviço incluem:
- Suporte a tamanhos de mensagens maiores do que 256 KB (camada Standard) ou 100 MB (camada Premium) por mensagem versus 64 KB para mensagens de fila do Armazenamento do Microsoft Azure.
- Suporte a entrega "no máximo uma vez" e no "mínimo uma vez". Escolha entre uma probabilidade muito pequena de uma mensagem ser perdida ou muito pequena para ser tratada duas vezes.
- Garantia da ordem FIFO (primeiro a entrar, primeiro a sair). As mensagens são tratadas na mesma ordem em que são adicionadas. Embora FIFO seja a operação normal de uma fila, o padrão FIFO será alterado se a organização configurar mensagens sequenciadas ou agendadas ou durante interrupções como uma falha do sistema. Para obter mais informações, confira Comparar filas de Armazenamento e do Barramento de Serviço do Azure.
- Pode agrupar várias mensagens em uma transação. Se uma mensagem na transação não for entregue, nenhuma mensagem será entregue.
- Suporte à segurança baseada em funções.
- Os componentes de destino não precisam pesquisar continuamente a fila.
Vantagens das filas de armazenamento:
- Suporte a tamanho ilimitado de fila (vs. o limite de 80 GB das filas do Barramento de Serviço)
- Mantém um log de todas as mensagens
Como escolher uma tecnologia de comunicação
Você viu os diferentes conceitos e implementações que o Azure fornece. Agora, vamos pensar em como o processo de decisão deve funcionar em cada uma de nossas comunicações.
Considerações
Ao escolher um método de envio e recebimento de mensagens, responder às seguintes perguntas pode ajudar:
A comunicação é um evento? Se sim, cogite usar a Grade de Eventos ou o Hubs de Eventos.
Uma única mensagem deve ser entregue para mais de um destino? Se sim, use um tópico do Barramento de Serviço. Caso contrário, use uma fila do Barramento de Serviço.
Filas: Barramento de Serviço versus armazenamento
Se você decidir que precisa de uma fila, restrinja ainda mais sua escolha.
Escolha uma fila do Barramento de Serviço se:
- Você precisa de uma garantia de entrega de "no máximo uma vez".
- É preciso ter uma garantia FIFO (se nenhuma outra configuração estiver substituindo a ordem FIFO padrão).
- Você precisa agrupar mensagens em transações.
- Você deseja receber mensagens sem sondagem da fila.
- Você precisa fornecer acesso baseado em função às filas.
- Você precisa lidar com mensagens maiores que 64 KB, mas menores que 256 KB na camada Standard ou de 100 MB na camada Premium.
- O tamanho da fila não excederá 80 GB.
- Você gostaria de poder publicar e consumir lotes de mensagens.
Escolha uma fila de armazenamento se:
- É necessário ter uma fila simples, sem requisitos extras específicos.
- Você precisa de uma trilha de auditoria de todas as mensagens que passam pela fila.
- Você espera que a fila exceda 80 GB de tamanho.
- Você deseja acompanhar o andamento do processamento de uma mensagem dentro da fila.
Embora os componentes de um aplicativo distribuído possam se comunicar diretamente, muitas vezes você pode aumentar a confiabilidade dessa comunicação utilizando uma plataforma de comunicação intermediária, como os Hubs de Eventos do Azure ou os eventos na Grade de Eventos do Azure.
Os Hubs e a Grade de Eventos foram projetados para eventos que notificam apenas os destinatários de um evento e não contêm os dados brutos associados ao evento em si. O Hub de Eventos do Azure foi projetado para eventos de análise de alto fluxo.
O Barramento de Serviços do Azure e as filas de armazenamento são para mensagens, que você pode utilizar para associar as peças principais de qualquer fluxo de trabalho do aplicativo.
Se seus requisitos forem simples, se desejar enviar cada mensagem para apenas um destino ou se quiser escrever código o mais rápido possível, uma fila de armazenamento poderá ser a melhor opção. Caso contrário, as filas do Barramento de Serviço fornecem muito mais opções e flexibilidade.
Caso queira enviar mensagens para vários assinantes, use um tópico do Barramento de Serviço.