Escolha uma entrega baseada em mensagens com filas

Concluído

Suponha que você esteja planejando a arquitetura para seu aplicativo de compartilhamento de música. Pretende garantir que os ficheiros de música são carregados para a API Web de forma fiável a partir da aplicação móvel. Em seguida, você deseja entregar os detalhes sobre novas músicas diretamente no aplicativo quando um artista adiciona novas músicas à sua coleção. Este cenário é um 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?

de armazenamento em fila é um serviço que usa o Armazenamento do Azure para armazenar um grande número de mensagens que podem ser acessadas com segurança de 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 que as possui.

O que é o Azure Service Bus Queues?

Service Bus é um sistema de agente de mensagens destinado a aplicativos corporativos. Esses aplicativos geralmente utilizam vários protocolos de comunicação, têm contratos de dados diferentes e requisitos de segurança mais altos, e podem incluir serviços na nuvem e no local. O Service Bus foi criado com base em uma infraestrutura de mensagens dedicada projetada exatamente para esses cenários.

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

O que são Tópicos do Barramento de Serviço do Azure?

Os tópicos do Barramento de Serviço do Azure são como filas, mas podem ter vários assinantes. Quando uma mensagem é enviada para um tópico em vez de uma fila, vários componentes podem ser acionados para fazer seu trabalho. Imagine que um utilizador está a ouvir uma música numa aplicação de partilha de música. O aplicativo móvel pode enviar uma mensagem para um tópico Listened. Esse tópico terá uma assinatura para UpdateUserListenHistory e uma assinatura diferente para UpdateArtistsFanList. Cada uma dessas funções é manipulada por um componente diferente que recebe sua própria cópia da mensagem.

Internamente, os tópicos usam filas. Quando se publica num tópico, a mensagem é copiada e colocada na fila de cada assinatura. A fila significa que a cópia da mensagem fica disponível para ser processada por cada ramificação de assinatura mesmo que o componente que processa essa assinatura esteja demasiado ocupado para processá-la.

Benefícios das filas

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

Maior fiabilidade

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

Garantias de entrega de mensagens

Os sistemas de fila geralmente garantem a entrega de cada mensagem na fila para um componente de destino. No entanto, estas garantias podem adotar diferentes abordagens:

  • At-Least-Once Delivery: Nessa abordagem, é garantida a entrega de cada mensagem a pelo menos um dos componentes que recuperam mensagens da fila. Observe, no entanto, 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 vai para apenas uma dessas instâncias. No entanto, se uma instância demorar muito tempo para processar a mensagem e um tempo limite expirar, a mensagem também poderá ser enviada para a outra instância. O código do seu aplicativo Web deve ser projetado com essa possibilidade em mente.

  • At-Most-Once Delivery: Nesta abordagem, cada mensagem não é garantida para entrega, e há uma pequena chance de que ela não chegue. No entanto, ao contrário da entrega emLeast-Once, não há nenhuma chance de que a mensagem seja entregue duas vezes. Isso às vezes é chamado de deteção automática de duplicados.

  • de primeiro emFirst-Out (FIFO): Na maioria dos sistemas de mensagens, as mensagens geralmente saem da fila na mesma ordem em que foram adicionadas, mas você deve considerar se essa entrega é garantida. Se o seu aplicativo distribuído requer que as mensagens sejam processadas na ordem correta, você deve escolher um sistema de fila que inclua uma garantia FIFO.

Suporte transacional

Alguns grupos de mensagens intimamente relacionados podem causar problemas quando a entrega falha para uma mensagem no 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 pode ser gerada e enviada para vários destinos de processamento:

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

Neste caso, queremos assegurar que todas as mensagens sejam processadas, ou nenhuma delas seja processada. Não estaremos em atividade por muito tempo se a mensagem do cartão de crédito não for entregue e todos os nossos pedidos forem atendidos sem pagamento. 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, assim como no mundo do banco de dados. Se a entrega da mensagem de detalhes do cartão de crédito falhar, a mensagem de detalhes do pedido também falhará.

Que serviço devo escolher?

Tendo entendido que a estratégia de comunicação para essa arquitetura deve ser uma mensagem, você deve escolher se deseja usar as filas de Armazenamento do Azure ou o Barramento de Serviço do Azure. Você pode usar ambas as tecnologias para armazenar e entregar mensagens entre seus componentes. Cada um tem um conjunto de recursos ligeiramente diferente, o que significa que você pode escolher um ou outro, ou usar ambos, dependendo do problema que está resolvendo.

Utilize filas do Barramento de Serviço se:

  • Precisa de uma garantia de entrega At-Most-Once.
  • Precisa de uma garantia FIFO.
  • Necessidade de agrupar mensagens em transações.
  • Deseja receber mensagens sem sondar a fila.
  • Necessidade de fornecer um modelo de acesso baseado em função para as filas.
  • Precisa lidar com mensagens maiores que 64 KB, mas menos de 100 MB. O tamanho máximo de mensagem suportado pela camada padrão é de 256 KB e a camada premium é de 100 MB.
  • O tamanho da fila não aumentará acima de 1 TB. O tamanho máximo da fila para a camada padrão é de 80 GB e para a camada premium, é de 1 TB.
  • Deseja publicar e consumir lotes de mensagens.

Utilize os tópicos do Service Bus se:

  • Precisa de todas as funcionalidades fornecidas pelas filas do Service Bus e, além disso, implemente um padrão pub-sub em que as mensagens possam ser encaminhadas para uma das várias assinaturas, cada uma com os seus próprios receptores independentes.

O armazenamento em fila não é tão rico em recursos, mas se você não precisar de nenhum desses recursos, pode ser uma escolha mais simples. Além disso, é a melhor solução se o seu aplicativo tiver algum dos seguintes requisitos.

Use o armazenamento em fila se:

  • Precisa de um registo de auditoria de todas as mensagens que passam pela fila.
  • Espere que a fila exceda 1 TB de tamanho.
  • Deseja acompanhar o progresso do processamento de uma mensagem dentro da fila.

Uma fila é um local de armazenamento temporário simples para mensagens enviadas entre os componentes de um aplicativo distribuído. Use uma fila para organizar mensagens e lidar graciosamente com picos imprevisíveis de demanda.

Use filas de armazenamento quando quiser um sistema de filas simples e fácil de codificar. Para necessidades mais avançadas, use filas do Service Bus. Se você tiver vários destinos para uma única mensagem, mas precisar de um comportamento semelhante a uma fila, use os tópicos do Service Bus.