Escolher uma entrega baseada em mensagens com filas
Suponha que você esteja planejando a arquitetura para seu aplicativo de compartilhamento de música. Quer garantir que o carregamento de ficheiros de música é efetuado da aplicação móvel para a API Web de forma viável. Em seguida, quer enviar os detalhes acerca de músicas novas diretamente para a aplicação quando um artista adiciona música nova à respetiva 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
- Azure Service Bus
O que é o Armazenamento de Filas do Azure?
O Armazenamento de Filas é um serviço que utiliza o Armazenamento do Azure para armazenar grandes quantidades de mensagens que podem ser acedidas de forma segura a partir de qualquer lugar do mundo através de uma interface baseada em REST simples. As filas podem conter milhões de mensagens, limitadas apenas pela capacidade da conta de armazenamento que a possui.
O que são as Filas do Azure Service Bus?
O 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 é criado sobre uma infraestrutura de mensagens dedicada, projetada exatamente para estes cenários.
Ambos os serviços se baseiam na ideia de uma fila que contém as mensagens enviadas até o destino estar preparado para as receber.
O que são os Tópicos do Azure Service Bus?
Tópicos do Azure Service Bus são semelhantes a filas, mas podem ter vários subscritores. Quando uma mensagem é enviada para um tópico em vez de uma fila, vários componentes podem ser acionados para desempenharem a respetiva função. Imagine que um utilizador está a ouvir uma música numa aplicação de partilha de música. A aplicação móvel pode enviar uma mensagem para o tópico "Ouvidas". Esse tópico terá uma subscrição para "UpdateUserListenHistory" e uma subscrição diferente para "UpdateArtistsFanList". Cada uma dessas funções é manipulada por um componente diferente, que recebe a sua própria cópia da mensagem.
Internamente, os tópicos utilizam filas. Quando posta um tópico, a mensagem é copiada e colocada numa fila para cada subscrição. A fila significa que a cópia da mensagem permanece por perto para ser processada por cada ramificação de assinatura, mesmo que o componente que processa essa assinatura esteja muito ocupado para acompanhar.
Benefícios de 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 utilizadas por aplicações distribuídas como localizações temporárias de armazenamento para as mensagens com entrega pendente para um componente de destino. O componente de origem pode adicionar uma mensagem à fila e os componentes de destino podem obter a mensagem na frente da fila para processamento. As filas aumentam a fiabilidade da troca de mensagens, porque, em momentos de procura elevada, as mensagens podem aguardar até que um componente de destino esteja pronto para as processar.
Garantias de entrega de mensagem
Normalmente, os sistemas de colocação em fila garantem a entrega de cada mensagem na fila para um componente de destino. Contudo, estas garantias podem assumir diferentes abordagens:
Entrega pelo menos uma vez: nessa abordagem, cada mensagem tem entrega garantida para pelo menos um dos componentes que recuperam mensagens da fila. No entanto, tenha em atenção que, em determinadas circunstâncias, é possível que a mesma mensagem seja entregue mais do que uma vez. Por exemplo, se existirem duas instâncias de uma aplicação Web a obter mensagens de uma fila, normalmente cada mensagem vai para apenas uma das duas 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 da aplicação Web deve ser concebido com essa possibilidade em mente.
Entrega quase uma vez: nessa abordagem, cada mensagem não tem garantia de entrega e há uma pequena chance de que ela não chegue. No entanto, ao contrário da entrega At-Least-Once, não há nenhuma chance de que a mensagem seja entregue duas vezes. Isto é por vezes referido como deteção automática de duplicados.
First-In-First-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 a sua aplicação distribuída precisar que as mensagens sejam processadas exatamente pela ordem correta, terá de escolher um sistema de fila que inclua uma garantia de FIFO.
Suporte transacional
Alguns grupos de mensagens intimamente relacionados podem causar problemas quando a entrega falha para uma mensagem no grupo.
Por exemplo, considere uma aplicação 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:
- É enviada uma mensagem com os detalhes do pedido 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
- É enviada uma mensagem com as informações do recibo para uma base de dados gerar uma fatura para o cliente
Neste caso, queremos assegurar-nos de que todas as mensagens são processadas ou nenhuma delas é 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! Pode evitar este tipo de problemas, agrupando as duas mensagens numa 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, o mesmo acontecerá à mensagem de detalhes do pedido.
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 as filas do Service Bus se:
- Precisa de uma garantia de entrega No-Máximo-Uma-Vez.
- Precisa de uma garantia de FIFO.
- Precisa de agrupar mensagens em transações.
- Quer receber mensagens sem consultar a fila.
- Precisa de apresentar um modelo de acesso baseado em funções 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á mais do que 1 TB. O tamanho máximo da fila para a camada padrão é de 80 GB e para a camada premium, é de 1 TB.
- Quer publicar e consumir lotes de mensagens.
Utilize os tópicos do Service Bus se:
- Precisa de todos os recursos fornecidos pelas filas do Service Bus e, além disso, implemente um padrão pub-sub onde as mensagens podem ser roteadas para uma das várias assinaturas, cada uma com seus próprios recetores independentes
O armazenamento de filas não é tão rico em termos de funcionalidades. No entanto, caso não precise dessas funcionalidades, pode ser uma escolha mais fácil. Além disso, é a melhor solução caso a sua aplicação tenha algum dos seguintes requisitos.
Utilize o Armazenamento de filas se:
- Precisa de um registo de auditoria de todas as mensagens que passam pela fila.
- Espere que a fila exceda 1 TB de tamanho.
- Quer controlar o progresso para processar uma mensagem dentro da fila.
Uma fila é uma localização de armazenamento temporário simples para as mensagens enviadas entre os componentes de uma aplicação distribuída. Utilize uma fila para organizar as mensagens e processar facilmente aumentos inesperados da procura.
Utilize as filas de Armazenamento se procura um sistema de fila simples e fácil de codificar. Para necessidades mais avançadas, utilize filas do Service Bus. Se tiver múltiplos destinos para uma única mensagem, mas precisar de comportamento parecido com o de fila, utilize os tópicos do Service Bus.