Escolher uma entrega baseada em mensagens com filas

Concluído

Suponha que você esteja planejando a arquitetura para seu aplicativo de compartilhamento de músicas. Você deseja ter certeza de que os arquivos de música serão carregados na API Web de forma confiável por meio do aplicativo móvel. Em seguida, você deseja fornecer os detalhes sobre novas músicas diretamente para o aplicativo quando um artista adiciona novas músicas à coleção. Esse cenário é um tipo de uso perfeito de um sistema baseado em mensagem, e o Azure oferece duas soluções para esse problema:

  • Armazenamento de Filas do Azure
  • Barramento de Serviço do Azure

O que é o Armazenamento de Filas do Azure?

O Armazenamento de Filas é um serviço que usa o Armazenamento do Azure para armazenar um grande número de mensagens que podem ser acessadas com segurança em qualquer lugar do mundo usando uma interface simples baseada em REST. As filas podem conter milhões de mensagens, limitadas apenas pela capacidade da conta de armazenamento a qual pertencem.

O que são as filas do Barramento de Serviço do Azure?

O Barramento de Serviço é um sistema de agente de mensagem destinado a aplicativos empresariais. Esses aplicativos geralmente utilizam vários protocolos de comunicação, têm contratos de dados diferentes e requisitos de segurança mais altos e ainda podem incluir serviços de nuvem e locais. O Barramento de Serviço é criado com base em uma infraestrutura de sistema de mensagens dedicada, projetada exatamente para esses cenários.

Esses dois serviços são baseados na ideia de uma fila que mantém as mensagens enviadas até que o destino esteja pronto para recebê-las.

Quais são os tópicos do Barramento de Serviço do Azure?

Os tópicos do Barramento de Serviço do Azure são como as filas, mas podem ter vários assinantes. Quando uma mensagem é enviada a um tópico em vez de a uma fila, vários componentes podem ser disparados para realizar seu trabalho. Imagine que um usuário está ouvindo uma música em um aplicativo de compartilhamento de música. O aplicativo móvel pode enviar uma mensagem ao tópico "Ouvida". Esse tópico terá uma assinatura para "UpdateUserListenHistory" e uma assinatura diferente para "UpdateArtistsFanList". Cada uma dessas funções é tratada por um componente diferente que recebe sua própria cópia da mensagem.

Internamente, os tópicos usam as filas. Quando você posta um tópico, a mensagem é copiada e colocada na fila para cada assinatura. A fila significa que a cópia da mensagem permanecerá para ser processada por cada branch de assinatura mesmo se o componente de processamento dessa assinatura estiver muito ocupado para acompanhar.

Benefícios das filas

As infraestruturas de fila podem dar suporte a muitos recursos avançados que as tornam úteis das maneiras descritas a seguir:

Maior confiabilidade

As filas são usadas por aplicativos distribuídos como um local de armazenamento temporário para mensagens com entrega pendente para um componente de destino. O componente de origem pode adicionar uma mensagem à fila e os componentes de destino podem recuperá-la na frente da fila para processamento. As filas aumentam a confiabilidade da troca de mensagens porque, em períodos de alta demanda, as mensagens podem esperar até que um componente de destino esteja pronto para processá-las.

Garantias de entrega de mensagem

Em geral, os sistemas de enfileiramento asseguram a entrega de cada mensagem na fila a um componente de destino. No entanto, essas garantias podem usar abordagens diferentes:

  • Entrega “pelo menos uma vez”: nesta abordagem, cada mensagem tem a garantia de ser entregue a, pelo menos, um dos componentes que recuperam mensagens da fila. No entanto, observe que em determinadas circunstâncias, é possível que a mesma mensagem seja entregue mais de uma vez. Por exemplo, se houver duas instâncias de um aplicativo Web recuperando mensagens de uma fila, normalmente, cada mensagem será encaminhada para apenas uma dessas instâncias. No entanto, se uma instância levar muito tempo para processar a mensagem e um tempo limite expirar, a mensagem poderá ser enviada à outra instância também. O código do aplicativo Web deve ser criado com essa possibilidade em mente.

  • Entrega “no máximo uma vez”: nesta abordagem, cada mensagem não tem a garantia de ser entregue e existe uma probabilidade pequena de que ela não seja recebida. No entanto, ao contrário da entrega Pelo Menos uma Vez, não há nenhuma probabilidade de que a mensagem seja entregue duas vezes. Às vezes, isso é chamado de detecção automática de duplicidades.

  • PEPS (primeiro a entrar, primeiro a sair): na maioria dos sistemas de mensagens, as mensagens geralmente deixam a fila na mesma ordem em que foram adicionadas, mas você deve considerar se essa entrega é garantida. Se o aplicativo distribuído exige que as mensagens sejam processadas precisamente na ordem correta, você precisa escolher um sistema de filas que inclua uma garantia de PEPS.

Suporte transacional

Alguns grupos de mensagens estreitamente relacionados podem causar problemas quando há falha na entrega de uma mensagem do grupo.

Por exemplo, considere um aplicativo de comércio eletrônico. Quando o usuário seleciona o botão Comprar, uma série de mensagens podem ser geradas e enviadas a vários destinos de processamento:

  • Uma mensagem com os detalhes do pedido é enviada a um centro de cumprimento
  • Uma mensagem com o total e os detalhes do pagamento é enviada a um processador de cartão de crédito
  • Uma mensagem com as informações de recebimento é enviada a um banco de dados para gerar a fatura do cliente

Nesse caso, queremos garantir que todas as mensagens sejam processadas ou que nenhuma delas seja processada. Os negócios não vão durar muito se as mensagens de cartão de crédito não forem entregues e o pagamento não for confirmado para todos os pedidos. Você pode evitar esses tipos de problemas agrupando as duas mensagens em uma transação. As transações de mensagens são bem-sucedidas ou falham como uma única unidade, como no mundo dos bancos de dados. Se a entrega da mensagem de detalhes do cartão de crédito falhar, ocorrerá o mesmo com a mensagem de detalhes do pedido.

Qual serviço devo escolher?

Depois de entender que a estratégia de comunicação para essa arquitetura deve ser uma mensagem, você precisa escolher se deseja usar as filas do Armazenamento do Microsoft Azure ou o Barramento de Serviço do Azure. Essas duas tecnologias podem ser usadas para armazenar e entregar mensagens entre os componentes. Cada uma tem um conjunto de recursos um pouco diferente, o que significa que você pode escolher uma ou outra ou usar ambas, dependendo do problema a ser resolvido.

Use as filas do Barramento de Serviço se:

  • Precisa de uma garantia de entrega de “no máximo uma vez”.
  • Precisa de uma garantia de PEPS.
  • Precisa agrupar mensagens em transações.
  • Quer receber mensagens sem sondar a fila.
  • Precisa fornecer um modelo de acesso baseado em função às filas.
  • Precisa lidar com mensagens com mais de 64 KB, mas menos de 100 MB. O tamanho máximo de mensagem com suporte da camada Standard é 256 KB e o da camada Premium é 100 MB.
  • O tamanho da fila não excederá 1 TB. O tamanho máximo da fila para a camada standard é 80 GB e para a camada Premium é 1 TB.
  • Deseja publicar e consumir lotes de mensagens.

Use os tópicos do Barramento de Serviço se:

  • São necessários todos os recursos fornecidos pelas filas do Barramento de Serviço e, além disso, implementar um padrão pub-sub onde as mensagens podem ser roteadas para uma das várias assinaturas, cada uma com seus próprios receptores independentes

O Armazenamento de Filas não é tão rico em recursos, mas se você não precisa de nenhum desses recursos, ele pode ser uma opção mais simples. Além disso, ele é a melhor solução se o aplicativo tem um dos requisitos a seguir.

Use o Armazenamento de Filas se:

  • Precisa de uma trilha de auditoria de todas as mensagens que passam pela fila.
  • Espera-se que a fila exceda 1 TB.
  • Deseja acompanhar o andamento do processamento de uma mensagem dentro da fila.

Uma fila é uma localização de armazenamento temporário simples para as mensagens enviadas entre os componentes de um aplicativo distribuído. Use uma fila para organizar mensagens e lidar normalmente com aumentos imprevisíveis na demanda.

Use filas do Armazenamento quando desejar usar um sistema de filas simples e fácil de ser codificado. Para necessidades mais avançadas, use as filas do Barramento de Serviço. Se você tiver vários destinos para uma única mensagem, mas precisar de um comportamento do tipo fila, use os tópicos de Barramento de Serviço.