Estilo de arquiteturaQueue-Worker Web
Os principais componentes dessa arquitetura são um front-end da Web que atende a solicitações de cliente e um trabalho que executa tarefas com uso intensivo de recursos, fluxos de trabalho de execução longa ou trabalhos em lotes. O front-end da Web se comunica com o trabalhador por meio de uma fila de mensagens.
Outros componentes que normalmente são incorporados a essa arquitetura incluem:
- Um ou mais bancos de dados.
- Um cache para armazenar valores do banco de dados para leituras rápidas.
- CDN para fornecer conteúdo estático
- Serviços remotos, como email ou serviço de SMS. Geralmente, esses recursos são fornecidos por terceiros.
- Provedor de identidade para autenticação.
A Web e o trabalho são ambos sem estado. O estado da sessão pode ser armazenado em um cache distribuído. Qualquer trabalho de longa execução é feito de forma assíncrona pelo trabalhador. O trabalho pode ser disparado por mensagens na fila ou executado em um agendamento para processamento em lote. O trabalho é um componente opcional. Se não houver operações de execução prolongada, o trabalho poderá ser omitido.
O front-end pode consistir em uma API Web. No lado do cliente, a API Web pode ser consumida por um aplicativo de página única que faz chamadas AJAX ou por um aplicativo cliente nativo.
Quando usar essa arquitetura
A arquitetura deQueue-Worker Web normalmente é implementada usando serviços de computação gerenciada, o Serviço de Aplicativo do Azure ou os Serviços de Nuvem do Azure.
Considere este estilo de arquitetura para:
- Aplicativos com um domínio relativamente simples.
- Aplicativos com alguns fluxos de trabalho de execução prolongada ou operações em lote.
- Quando você deseja usar serviços gerenciados, em vez de iaaS (infraestrutura como serviço).
Benefícios
- Arquitetura relativamente simples que é fácil de entender.
- Fácil de implantar e gerenciar.
- Separação clara de preocupações.
- O front-end é dissociado do trabalho usando mensagens assíncronas.
- O front-end e o trabalho podem ser dimensionados de forma independente.
Desafios
- Sem um design cuidadoso, o front-end e o trabalho podem se tornar componentes grandes e monolíticos difíceis de manter e atualizar.
- Pode haver dependências ocultas se o front-end e o worker compartilharem esquemas de dados ou módulos de código.
- O front-end da Web pode funcionar mal depois de persistir com êxito no banco de dados, mas antes de emitir as mensagens para a fila. Isso pode resultar em possíveis problemas de consistência, pois o trabalhador não executará sua parte da lógica. Técnicas como o padrão de caixa de saída transacional podem ser usadas para ajudar a atenuar esse problema, mas exigem a alteração do roteamento de mensagens de saída para o primeiro "loop back" por meio de uma fila separada. Uma biblioteca que fornece suporte para essa técnica é a Sessão Transacional NServiceBus.
Práticas recomendadas
- Exponha uma API bem projetada ao cliente. Consulte as práticas recomendadas de design de API.
- Dimensionamento automático para lidar com alterações na carga. Consulte práticas recomendadas de dimensionamento automático.
- Armazenar dados semi estáticos em cache. Consulte práticas recomendadas de cache.
- Use uma CDN para hospedar conteúdo estático. Consulte as práticas recomendadas da CDN.
- Use persistência poliglota quando apropriado. Consulte [Usar o melhor armazenamento de dados para o trabalho][poliglot].
- Dados de partição para melhorar a escalabilidade, reduzir a contenção e otimizar o desempenho. Consulte as práticas recomendadas de particionamento de dados.
Web-Queue-Worker no Serviço de Aplicativo do Azure
Esta seção descreve uma arquitetura deQueue-Worker da Web recomendada que usa o Serviço de Aplicativo do Azure.
Baixe um arquivo do Visio dessa arquitetura.
Fluxo de Trabalho
O front-end é implementado como um aplicativo Web do Serviço de Aplicativo do Azure e o trabalho é implementado como um aplicativo do Azure Functions . O aplicativo Web e o aplicativo de funções estão associados a um plano do Serviço de Aplicativo que fornece as instâncias da VM.
Você pode usar as filas do Barramento de Serviço do Azure ou do Armazenamento do Azure para a fila de mensagens. (O diagrama mostra uma fila do Armazenamento do Azure.)
O Cache do Azure para Redis armazena o estado da sessão e outros dados que precisam de acesso de baixa latência.
A CDN do Azure é usada para armazenar em cache conteúdo estático, como imagens, CSS ou HTML.
Para armazenamento, escolha as tecnologias de armazenamento que melhor atendem às necessidades do aplicativo. Você pode usar várias tecnologias de armazenamento (persistência poliglota). Para ilustrar essa ideia, o diagrama mostra o Banco de Dados SQL do Azure e o Azure Cosmos DB.
Para obter mais informações, consulte a arquitetura de referência de aplicativo Web do Serviço de Aplicativo e como criar aplicativos de negócios controlados por mensagens com o NServiceBus e o Barramento de Serviço do Azure.
Outras considerações
Nem toda transação precisa passar pela fila e trabalhar no armazenamento. O front-end da Web pode executar operações simples de leitura/gravação diretamente. Os trabalhadores são projetados para tarefas com uso intensivo de recursos ou fluxos de trabalho de execução longa. Em alguns casos, talvez você não precise de um trabalhador.
Use o recurso de dimensionamento automático interno do Serviço de Aplicativo para escalar horizontalmente o número de instâncias de VM. Se a carga no aplicativo seguir padrões previsíveis, use o dimensionamento automático baseado em agendamento. Se a carga for imprevisível, use regras de dimensionamento automático baseadas em métricas.
Considere colocar o aplicativo Web e o aplicativo de funções em planos separados do Serviço de Aplicativo. Dessa forma, eles podem ser dimensionados de forma independente.
Use planos separados do Serviço de Aplicativo para produção e teste. Caso contrário, se você usar o mesmo plano para produção e teste, isso significa que seus testes estão sendo executados em suas VMs de produção.
Use slots de implantação para gerenciar implantações. Esse método permite implantar uma versão atualizada em um slot de preparo e, em seguida, alternar para a nova versão. Ele também permite que você alterne de volta para a versão anterior, se houver um problema com a atualização.