Estilo de arquiteturaQueue-Worker Web
Os principais componentes dessa arquitetura são um front-end da Web que atende às solicitações do cliente e um trabalhador que executa tarefas que consomem muitos recursos, fluxos de trabalho de longa execução ou trabalhos em lote. O front-end da Web se comunica com o trabalhador por meio de uma fila de mensagens.
Outros componentes que são comumente incorporados a essa arquitetura incluem:
- Uma ou mais bases 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 e-mail ou serviço de SMS. Muitas vezes, esses recursos são fornecidos por terceiros.
- Provedor de identidade para autenticação.
A Web e o trabalhador são ambos apátridas. O estado da sessão pode ser armazenado em um cache distribuído. Qualquer trabalho de longa duração é feito de forma assíncrona pelo trabalhador. O trabalhador pode ser acionado por mensagens na fila ou executado em um agendamento para processamento em lote. O trabalhador é um componente opcional. Se não houver operações de longa duração, o trabalhador pode ser omitido.
O front-end pode consistir em uma API da Web. No lado do cliente, a API da Web pode ser consumida por um aplicativo de página única que faz chamadas AJAX ou por um aplicativo cliente nativo.
Quando usar esta arquitetura
A arquitetura deQueue-Worker da Web normalmente é implementada usando serviços de computação gerenciados, o Serviço de Aplicativo do Azure ou os Serviços de Nuvem do Azure.
Considere este estilo de arquitetura para:
- Aplicações com um domínio relativamente simples.
- Aplicativos com alguns fluxos de trabalho de longa duração ou operações em lote.
- Quando você deseja usar serviços gerenciados, em vez de infraestrutura como serviço (IaaS).
Benefícios
- Arquitetura relativamente simples e fácil de entender.
- Facilidade de implementação e gestão.
- Separação clara de preocupações.
- O front-end é dissociado do trabalhador usando mensagens assíncronas.
- O front-end e o trabalhador podem ser dimensionados de forma independente.
Desafios
- Sem um design cuidadoso, o front-end e o trabalhador podem se tornar componentes grandes e monolíticos que são difíceis de manter e atualizar.
- Pode haver dependências ocultas, se o front-end e o trabalhador 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 mitigar esse problema, mas exigem alterar o roteamento de mensagens de saída para primeiro "loop back" através de uma fila separada. Uma biblioteca que fornece suporte para essa técnica é a sessão transacional NServiceBus.
Melhores práticas
- Exponha uma API bem projetada para o cliente. Consulte 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 semiestá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 a persistência poliglota quando apropriado. Consulte [Usar o melhor armazenamento de dados para o trabalho][poliglota].
- Particione dados para melhorar a escalabilidade, reduzir a contenção e otimizar o desempenho. Consulte 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 Visio desta arquitetura.
Fluxo de trabalho
O front-end é implementado como um aplicativo Web do Serviço de Aplicativo do Azure e o trabalhador é implementado como um aplicativo do Azure Functions . O aplicativo Web e o aplicativo de função estão associados a um plano do Serviço de Aplicativo que fornece as instâncias da VM.
Você pode usar as filasdo Barramento de Serviço do Azure ou do Armazenamento do Azure para a fila de mensagens. (O diagrama mostra uma fila de Armazenamento do Azure.)
O Cache Redis do Azure 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 se ajustam à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 do aplicativo Web do Serviço de Aplicativo e como criar aplicativos de negócios controlados por mensagem com o NServiceBus e o Azure Service Bus.
Outras considerações
Nem todas as transações precisam passar pela fila e trabalhar para o armazenamento. O front-end da Web pode executar operações simples de leitura/gravação diretamente. Os trabalhadores são projetados para tarefas que consomem muitos recursos ou fluxos de trabalho de longa execução. Em alguns casos, você pode não precisar de um trabalhador.
Use o recurso de dimensionamento automático interno do Serviço de Aplicativo para dimensionar 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ção 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, trocar para a nova versão. Ele também permite que você troque de volta para a versão anterior, se houver um problema com a atualização.