Filas de armazenamento e filas do Service Bus - comparadas e contrastadas

Este artigo analisa as diferenças e semelhanças entre os dois tipos de filas oferecidas pelo Microsoft Azure: filas de armazenamento e filas do Service Bus. Usando essas informações, você pode tomar uma decisão mais informada sobre qual solução melhor atende às suas necessidades.

Introdução

O Azure dá suporte a dois tipos de mecanismos de fila: filas de armazenamento e filas do Barramento de Serviço.

As filas de armazenamento fazem parte da infraestrutura de Armazenamento do Azure. Eles permitem que você armazene um grande número de mensagens. Você acessa mensagens de qualquer lugar do mundo por meio de chamadas autenticadas usando HTTP ou HTTPS. Uma mensagem de fila pode ter até 64 KB de tamanho. Uma fila pode conter milhões de mensagens, até o limite de capacidade total de uma conta de armazenamento. As filas são comumente usadas para criar uma lista de pendências de trabalho para processar de forma assíncrona. Para obter mais informações, consulte O que são filas de armazenamento do Azure.

As filas do Barramento de Serviço fazem parte de uma infraestrutura de mensagens do Azure mais ampla que dá suporte a enfileiramento, publicação/assinatura e padrões de integração mais avançados. Eles são projetados para integrar aplicativos ou componentes de aplicativos que podem abranger vários protocolos de comunicação, contratos de dados, domínios de confiança ou ambientes de rede. Para obter mais informações sobre filas/tópicos/assinaturas do Barramento de Serviço, consulte as filas, tópicos e assinaturas do Barramento de Serviço.

Considerações sobre a seleção de tecnologia

As filas de armazenamento e as filas do Service Bus têm um conjunto de recursos ligeiramente diferente. Pode escolher uma ou ambas, dependendo das necessidades da sua solução em particular.

Ao determinar qual tecnologia de fila se encaixa no propósito de uma determinada solução, os arquitetos e desenvolvedores de soluções devem considerar essas recomendações.

Considere o uso de filas de armazenamento

Como arquiteto/desenvolvedor de soluções, você deve considerar o uso de filas de armazenamento quando:

  • Seu aplicativo deve armazenar mais de 80 gigabytes de mensagens em uma fila.
  • Seu aplicativo deseja acompanhar o progresso do processamento de uma mensagem na fila. É útil se o trabalhador que processa uma mensagem falhar. Outro trabalhador pode então usar essas informações para continuar de onde o trabalhador anterior parou.
  • Você precisa de logs do lado do servidor de todas as transações executadas em suas filas.

Considere o uso de filas do Service Bus

Como arquiteto/desenvolvedor de soluções, você deve considerar o uso de filas do Service Bus quando:

  • Sua solução precisa receber mensagens sem ter que sondar a fila. Com o Service Bus, você pode obtê-lo usando uma operação de recebimento de sondagem longa usando os protocolos baseados em TCP suportados pelo Service Bus.
  • Sua solução requer que a fila forneça uma entrega garantida de pedidos FIFO (first-in-first-out).
  • Sua solução precisa oferecer suporte à deteção automática de duplicatas.
  • Você deseja que seu aplicativo processe mensagens como fluxos paralelos de longa execução (as mensagens são associadas a um fluxo usando a propriedade ID da sessão na mensagem). Nesse modelo, cada nó no aplicativo consumidor compete por fluxos, em vez de mensagens. Quando um fluxo é dado a um nó consumidor, o nó pode examinar o estado do estado do fluxo do aplicativo usando transações.
  • Sua solução requer comportamento transacional e atomicidade ao enviar ou receber várias mensagens de uma fila.
  • Seu aplicativo lida com mensagens que podem exceder 64 KB, mas provavelmente não se aproximará do limite de 256 KB ou 1 MB, dependendo da camada de serviço escolhida (embora as filas do Barramento de Serviço possam lidar com mensagens de até 100 MB).
  • Você lida com um requisito para fornecer um modelo de acesso baseado em função para as filas e diferentes direitos/permissões para remetentes e destinatários. Para obter mais informações, consulte os seguintes artigos:
  • O tamanho da fila não aumentará mais do que 80 GB.
  • Você deseja usar o protocolo de mensagens baseado em padrões AMQP 1.0. Para obter mais informações sobre AMQP, consulte Visão geral do AMQP do Service Bus.
  • Você imagina uma eventual migração da comunicação ponto a ponto baseada em fila para um padrão de mensagens de publicação-assinatura. Este padrão permite a integração de recetores adicionais (assinantes). Cada destinatário recebe cópias independentes de algumas ou de todas as mensagens enviadas para a fila.
  • Sua solução de mensagens precisa suportar as garantias de entrega "At-Most-Once" e "At-Least-Once" sem a necessidade de criar os componentes de infraestrutura adicionais.
  • Sua solução precisa publicar e consumir lotes de mensagens.

Comparar filas de armazenamento e filas do Service Bus

As tabelas nas seções a seguir fornecem um agrupamento lógico de recursos de fila. Eles permitem que você compare, rapidamente, os recursos disponíveis nas filas do Armazenamento do Azure e nas filas do Barramento de Serviço.

Capacidades fundamentais

Esta seção compara alguns dos recursos fundamentais de enfileiramento fornecidos pelas filas de armazenamento e filas do Service Bus.

Critérios de comparação Filas de armazenamento Filas do Service Bus
Garantia de encomenda Não

Para obter mais informações, consulte a primeira nota na seção Informações adicionais.
Sim - Primeiro a Entrar, Primeiro a Sair (FIFO)

(usando sessões de mensagem)
Garantia de entrega Pelo menos uma vez At-Least-Once (usando o modo de receção PeekLock. É o padrão)

At-Most-Once (usando o modo de recebimento ReceiveAndDelete)

Saiba mais sobre vários modos de recebimento
Apoio à operação atómica Não Sim

Comportamento de recebimento Sem bloqueio

(conclui imediatamente se nenhuma nova mensagem for encontrada)
Bloqueio com ou sem tempo limite

(oferece sondagens longas, ou a "técnica do cometa ")

Sem bloqueio

(usando somente a API gerenciada do .NET)
API estilo push Não Sim

Nossos SDKs .NET, Java, JavaScript e Go fornecem API no estilo push.
Modo de receção Espreitar & Arrendamento Espreitar & Bloquear

Receber & Excluir
Modo de acesso exclusivo Baseado em locação Baseado em bloqueio
Duração da locação/bloqueio 30 segundos (padrão)

7 dias (máximo) (Você pode renovar ou liberar uma concessão de mensagem usando a API UpdateMessage .)
30 segundos (padrão)

Você pode renovar o bloqueio de mensagem para a mesma duração de bloqueio cada vez manualmente ou usar o recurso de renovação automática de bloqueio onde o cliente gerencia a renovação de bloqueio para você.
Precisão de locação/bloqueio Nível da mensagem

Cada mensagem pode ter um valor de tempo limite diferente, que você pode atualizar conforme necessário durante o processamento da mensagem, usando a API UpdateMessage .
Nível da fila

(cada fila tem uma precisão de bloqueio aplicada a todas as suas mensagens, mas o bloqueio pode ser renovado conforme descrito na linha anterior)
Recebimento em lote Sim

(especificando explicitamente a contagem de mensagens ao recuperar mensagens, até um máximo de 32 mensagens)
Sim

(habilitando implicitamente uma propriedade de pré-busca ou explicitamente usando transações)
Envio em lote Não Sim

(usando transações ou lotes do lado do cliente)

Informações adicionais

  • As mensagens nas filas de armazenamento geralmente são "primeiro a entrar, primeiro a sair", mas às vezes podem estar fora de ordem. Por exemplo, quando a duração do tempo limite de visibilidade de uma mensagem expira porque um aplicativo cliente falhou durante o processamento de uma mensagem. Quando o tempo limite de visibilidade expira, a mensagem torna-se visível novamente na fila para que outro trabalhador a retire da fila. Nesse ponto, a mensagem recém-visível pode ser colocada na fila para ser retirada da fila novamente.
  • O padrão FIFO garantido em filas do Service Bus requer o uso de sessões de mensagens. Se o aplicativo falhar enquanto está processando uma mensagem recebida no modo Peek & Lock , da próxima vez que um recetor de fila aceitar uma sessão de mensagens, ele começará com a mensagem com falha depois que a duração do bloqueio da sessão expirar.
  • As filas de armazenamento são projetadas para oferecer suporte a cenários de enfileiramento padrão, como os seguintes:
    • Desacoplamento de componentes de aplicativos para aumentar a escalabilidade e a tolerância a falhas
    • Nivelamento de carga
    • Criação de fluxos de trabalho de processos.
  • Inconsistências em relação ao tratamento de mensagens no contexto de sessões do Service Bus podem ser evitadas usando o estado da sessão para armazenar o estado do aplicativo em relação ao progresso do processamento da sequência de mensagens da sessão e usando transações relacionadas à liquidação de mensagens recebidas e atualização do estado da sessão. Esse tipo de recurso de consistência às vezes é rotulado exatamente uma vez no processamento em produtos de outros fornecedores. Qualquer falha de transação obviamente fará com que as mensagens sejam reentregues e é por isso que o termo não é exatamente adequado.
  • As filas de armazenamento fornecem um modelo de programação uniforme e consistente entre filas, tabelas e BLOBs – tanto para desenvolvedores quanto para equipes de operações.
  • As filas do Barramento de Serviço fornecem suporte para transações locais no contexto de uma única fila.
  • O modo Receber e Excluir suportado pelo Service Bus oferece a capacidade de reduzir a contagem de operações de mensagens (e o custo associado) em troca de uma garantia de entrega reduzida.
  • As filas de armazenamento fornecem concessões com a capacidade de estender as concessões para mensagens. Esse recurso permite que os processos de trabalho mantenham concessões curtas em mensagens. Assim, se um trabalhador falhar, a mensagem pode ser rapidamente processada novamente por outro trabalhador. Além disso, um trabalhador pode estender a concessão de uma mensagem se precisar processá-la por mais tempo do que o tempo de concessão atual.
  • As filas de armazenamento oferecem um tempo limite de visibilidade que você pode definir no enfileiramento ou enfileiramento de uma mensagem. Além disso, você pode atualizar uma mensagem com diferentes valores de concessão em tempo de execução e atualizar valores diferentes entre mensagens na mesma fila. Os tempos limite de bloqueio do Barramento de Serviço são definidos nos metadados da fila. No entanto, você pode renovar o bloqueio de mensagem para a duração do bloqueio predefinido manualmente ou usar o recurso de renovação automática de bloqueio em que o cliente gerencia a renovação do bloqueio para você.
  • O tempo limite máximo para uma operação de recebimento de bloqueio em filas do Service Bus é de 24 dias. No entanto, os tempos limite baseados em REST têm um valor máximo de 55 segundos.
  • O processamento em lote do lado do cliente fornecido pelo Service Bus permite que um cliente de fila agrupe várias mensagens em uma única operação de envio. O envio em lote só está disponível para operações de envio assíncronas.
  • Recursos como o teto de 200 TB de filas de armazenamento (mais quando você virtualiza contas) e filas ilimitadas o tornam uma plataforma ideal para provedores de SaaS.
  • As filas de armazenamento fornecem um mecanismo de controle de acesso delegado flexível e eficiente.

Capacidades avançadas

Esta seção compara os recursos avançados fornecidos pelas filas de armazenamento e filas do Service Bus.

Critérios de comparação Filas de armazenamento Filas do Service Bus
Entrega agendada Sim Sim
Letras mortas automáticas Não Sim
Aumentando o valor do tempo de vida útil da fila Sim

(via atualização in-loco do tempo limite de visibilidade)
Sim

(fornecido através de uma função API dedicada)
Suporte a mensagens suspeitas Sim Sim
Atualização in-loco Sim Sim
Log de transações do lado do servidor Sim No
Métricas de armazenamento Sim

O Minute Metrics fornece métricas em tempo real para disponibilidade, TPS, contagens de chamadas de API, contagens de erros e muito mais. Eles são todos em tempo real, agregados por minuto e relatados em poucos minutos do que acabou de acontecer na produção. Para obter mais informações, consulte Sobre métricas do Storage Analytics.
Sim

Para obter informações sobre métricas suportadas pelo Barramento de Serviço do Azure, consulte Métricas de mensagem.
Gestão de estados Não Sim (Ativo, Desativado, SendDisabled, ReceiveDisabled. Para obter detalhes sobre esses estados, consulte Status da fila)
Reencaminhamento automático de mensagens Não Sim
Função de fila de limpeza Sim No
Grupos de mensagens Não Sim

(usando sessões de mensagens)
Estado do aplicativo por grupo de mensagens Não Sim
Deteção de duplicados Não Sim

(configurável no lado do remetente)
Navegar em grupos de mensagens Não Sim
Obtenção de sessões de mensagens por ID Não Sim

Informações adicionais

  • Ambas as tecnologias de fila permitem que uma mensagem seja agendada para entrega posterior.
  • O encaminhamento automático de filas permite que milhares de filas encaminhem automaticamente suas mensagens para uma única fila, a partir da qual o aplicativo recetor consome a mensagem. Você pode usar esse mecanismo para obter segurança, controlar o fluxo e isolar o armazenamento entre cada editor de mensagens.
  • As filas de armazenamento fornecem suporte para atualizar o conteúdo das mensagens. Você pode usar essa funcionalidade para informações de estado persistentes e atualizações de progresso incrementais na mensagem para que ela possa ser processada a partir do último ponto de verificação conhecido, em vez de começar do zero. Com as filas do Service Bus, você pode habilitar o mesmo cenário usando sessões de mensagens. Para obter mais informações, consulte Estado da sessão de mensagem.
  • As filas do Barramento de Serviço suportam letras mortas. Pode ser útil para isolar mensagens que atendam aos seguintes critérios:
    • As mensagens não podem ser processadas com êxito pelo aplicativo recetor
    • As mensagens não podem chegar ao destino devido a uma propriedade TTL (time-to-live) expirada. O valor TTL especifica quanto tempo uma mensagem permanece na fila. Com o Service Bus, a mensagem será movida para uma fila especial chamada $DeadLetterQueue quando o período TTL expirar.
  • Para localizar mensagens "suspeitas" em filas de armazenamento, ao deenfileirar uma mensagem, o aplicativo examina a propriedade DequeueCount da mensagem. Se DequeueCount for maior que um determinado limite, o aplicativo moverá a mensagem para uma fila de "letra morta" definida pelo aplicativo.
  • As filas de armazenamento permitem obter um log detalhado de todas as transações executadas na fila e métricas agregadas. Ambas as opções são úteis para depurar e entender como seu aplicativo usa filas de armazenamento. Eles também são úteis para ajustar o desempenho de seu aplicativo e reduzir os custos de uso de filas.
  • As sessões de mensagens suportadas pelo Service Bus permitem que mensagens que pertencem a um grupo lógico sejam associadas a um recetor. Ele cria uma afinidade de sessão entre as mensagens e seus respetivos recetores. Você pode habilitar essa funcionalidade avançada no Service Bus definindo a propriedade ID da sessão em uma mensagem. Os recetores podem então ouvir em um ID de sessão específico e receber mensagens que compartilham o identificador de sessão especificado.
  • O recurso de deteção de duplicação das filas do Barramento de Serviço remove automaticamente mensagens duplicadas enviadas para uma fila ou tópico, com base no valor da propriedade ID da mensagem.

Capacidade e quotas

Esta seção compara as filas de armazenamento e as filas do Service Bus da perspetiva da capacidade e das cotas que podem ser aplicadas.

Critérios de comparação Filas de armazenamento Filas do Service Bus
Tamanho máximo da fila 500 TB

(limitado a uma única capacidade de conta de armazenamento)
1 GB até 80 GB

(definido após a criação de uma fila e habilitação do particionamento – consulte a seção "Informações adicionais")
Tamanho máximo da mensagem 64 KB

(48 KB ao usar a codificação Base 64)

O Azure dá suporte a mensagens grandes combinando filas e blobs, momento em que você pode enfileirar até 200 GB para um único item.
256 KB ou 100 MB

(incluindo cabeçalho e corpo, tamanho máximo do cabeçalho: 64 KB).

Depende da camada de serviço.
Máximo de mensagens TTL Infinite (api-versão 2017-07-27 ou posterior) TimeSpan.MaxValue
Número máximo de filas Ilimitado 10.000

(por namespace de serviço)
Número máximo de clientes simultâneos Ilimitado 5.000

Informações adicionais

  • O Service Bus impõe limites de tamanho de fila. O tamanho máximo da fila é especificado ao criar uma fila. Pode ter entre 1 GB e 80 GB. Se o tamanho da fila atingir esse limite, mensagens de entrada adicionais serão rejeitadas e o chamador receberá uma exceção. Para obter mais informações sobre cotas no Service Bus, consulte Cotas do Service Bus.
  • Na camada de mensagens padrão, você pode criar filas e tópicos do Barramento de Serviço nos tamanhos 1 (padrão), 2, 3, 4 ou 5 GB. Ao habilitar o particionamento na camada Padrão, o Service Bus cria 16 cópias (16 partições) da entidade, cada uma do mesmo tamanho especificado. Como tal, se criar uma fila com 5 GB de tamanho, com 16 partições o tamanho máximo da fila torna-se (5 * 16) = 80 GB. Você pode ver o tamanho máximo de sua fila particionada ou tópico no portal do Azure.
  • Com filas de armazenamento, se o conteúdo da mensagem não for seguro para XML, ela deverá ser codificada em Base64 . Se você codificar a mensagem Base64, a carga útil do usuário pode ser de até 48 KB, em vez de 64 KB.
  • Com as filas do Barramento de Serviço, cada mensagem armazenada em uma fila é composta por duas partes: um cabeçalho e um corpo. O tamanho total da mensagem não pode exceder o tamanho máximo de mensagem suportado pela camada de serviço.
  • Quando os clientes se comunicam com filas do Service Bus pelo protocolo TCP, o número máximo de conexões simultâneas com uma única fila do Service Bus é limitado a 100. Este número é partilhado entre remetentes e destinatários. Se essa cota for atingida, as solicitações de conexões adicionais serão rejeitadas e uma exceção será recebida pelo código de chamada. Esse limite não é imposto aos clientes que se conectam às filas usando a API baseada em REST.
  • Se você precisar de mais de 10.000 filas em um único namespace do Service Bus, poderá entrar em contato com a equipe de suporte do Azure e solicitar um aumento. Para expandir além de 10.000 filas com o Service Bus, você também pode criar namespaces adicionais usando o portal do Azure.

Gestão e operações

Esta seção compara os recursos de gerenciamento fornecidos pelas filas de armazenamento e filas do Service Bus.

Critérios de comparação Filas de armazenamento Filas do Service Bus
Protocolo de gestão REST sobre HTTP/HTTPS REST sobre HTTPS
Protocolo de tempo de execução REST sobre HTTP/HTTPS REST sobre HTTPS

Padrão AMQP 1.0 (TCP com TLS)
API .NET Sim

(API do cliente de armazenamento .NET)
Sim

(API do .NET Service Bus)
C++ Nativo Sim Sim
API de Java Sim Sim
PHP API Sim Sim
API do Node.js Sim Sim
Suporte a metadados arbitrários Sim No
Regras de nomenclatura de fila Até 63 caracteres

(As letras no nome de uma fila devem ser minúsculas.)
Até 260 caracteres

(Os caminhos e nomes da fila não diferenciam maiúsculas de minúsculas.)
Obter função de comprimento da fila Sim

(Valor aproximado se as mensagens expirarem além do TTL sem serem excluídas.)
Sim

(Valor exato point-in-time.)
Função Espreitar Sim Sim

Informações adicionais

  • As filas de armazenamento fornecem suporte para atributos arbitrários que podem ser aplicados à descrição da fila, na forma de pares nome/valor.
  • Ambas as tecnologias de fila oferecem a capacidade de espiar uma mensagem sem ter que bloqueá-la, o que pode ser útil ao implementar uma ferramenta de explorador/navegador de filas.
  • As APIs de mensagens agenciadas pelo Service Bus .NET usam conexões TCP full-duplex para melhorar o desempenho quando comparadas ao REST sobre HTTP e suportam o protocolo padrão AMQP 1.0.
  • Os nomes das filas de armazenamento podem ter de 3 a 63 caracteres, podem conter letras minúsculas, números e hífenes. Para obter mais informações, consulte Nomeando filas e metadados.
  • Os nomes das filas do Barramento de Serviço podem ter até 260 caracteres e regras de nomenclatura menos restritivas. Os nomes das filas do Barramento de Serviço podem conter letras, números, pontos, hífenes e sublinhados.

Autenticação e autorização

Esta seção discute os recursos de autenticação e autorização suportados pelas filas de armazenamento e filas do Service Bus.

Critérios de comparação Filas de armazenamento Filas do Service Bus
Autenticação Chave simétrica e controle de acesso baseado em função (RBAC) Chave simétrica e controle de acesso baseado em função (RBAC)
Federação do provedor de identidade Sim Sim

Informações adicionais

  • Todas as solicitações para qualquer uma das tecnologias de fila devem ser autenticadas. Não há suporte para filas públicas com acesso anônimo.
  • Usando a autenticação de assinatura de acesso compartilhado (SAS), você pode criar uma regra de autorização de acesso compartilhado em uma fila que pode dar aos usuários acesso somente gravação, somente leitura ou total. Para obter mais informações, consulte Armazenamento do Azure - autenticação SAS e Barramento de Serviço do Azure - autenticação SAS.
  • Ambas as filas oferecem suporte à autorização de acesso usando o Microsoft Entra ID. Autorizar usuários ou aplicativos usando o token OAuth 2.0 retornado pelo Microsoft Entra ID oferece segurança superior e facilidade de uso em relação às assinaturas de acesso compartilhado (SAS). Com o Microsoft Entra ID, não há necessidade de armazenar os tokens em seu código e arriscar possíveis vulnerabilidades de segurança. Para obter mais informações, consulte Armazenamento do Azure - autenticação do Microsoft Entra e Barramento de Serviço do Azure - autenticação do Microsoft Entra.

Conclusão

Ao obter uma compreensão mais profunda das duas tecnologias, você pode tomar uma decisão mais informada sobre qual tecnologia de fila usar e quando. A decisão sobre quando usar filas de armazenamento ou filas do Service Bus depende claramente de muitos fatores. Esses fatores dependem muito das necessidades individuais do seu aplicativo e de sua arquitetura.

Você pode preferir escolher filas de armazenamento por motivos como os seguintes:

  • Se o seu aplicativo já usa os recursos principais do Microsoft Azure
  • Se você precisar de comunicação básica e mensagens entre serviços
  • Precisa de filas que podem ser maiores que 80 GB de tamanho

As filas do Barramento de Serviço fornecem muitos recursos avançados, como os seguintes. Portanto, eles podem ser uma escolha preferida se você estiver criando um aplicativo híbrido ou se seu aplicativo exigir esses recursos.

Próximos passos

Os artigos a seguir fornecem mais orientações e informações sobre como usar filas de armazenamento ou filas do Service Bus.