Consolidar várias tarefas ou operações em uma única unidade de computação. Isso pode aumentar a utilização de recursos de computação, reduzir os custos e as despesas gerais de gerenciamento associados à execução de processamento de computação em aplicativos hospedados na nuvem.
Contexto e problema
Um aplicativo de nuvem geralmente implementa uma variedade de operações. Em algumas soluções, faz sentido seguir inicialmente o princípio do projeto de separação de preocupações e dividir essas operações em unidades computacionais separadas que são hospedadas e implantadas individualmente (por exemplo, como aplicativos Web do Serviço de Aplicativo separados, Máquinas Virtuais separadas ou funções de Serviço de Nuvem separadas). No entanto, embora essa estratégia possa ajudar a simplificar o design lógico da solução, a implantação de um grande número de unidades computacionais como parte do mesmo aplicativo pode aumentar os custos de hospedagem de runtime e tornar o gerenciamento do sistema mais complexo.
Como um exemplo, a figura mostra a estrutura simplificada de uma solução hospedada na nuvem que é implementada utilizando mais de uma unidade computacional. Cada unidade computacional é executada em seu próprio ambiente virtual. Cada função foi implementada como uma tarefa separada (rotulada Tarefa A através da Tarefa E) em execução em sua própria unidade computacional.
Cada unidade computacional consome recursos passíveis de cobrança, mesmo que seja ocioso ou de uso leve. Portanto, essa não é sempre a solução mais econômica.
No Azure, essa preocupação se aplica a Serviços de Aplicativos, Aplicativos de Contêiner e Máquinas Virtuais. Esses itens são executados em seu ambiente. A execução de uma coleção de sites, microsserviços ou máquinas virtuais separadas que são projetadas para executar um conjunto de operações bem definidas, mas que precisam se comunicar e cooperar como parte de uma única solução, podem ser uma utilização de recursos ineficiente.
Solução
Para ajudar a reduzir custos, aumentar a utilização, melhorar a velocidade de comunicação e reduzir o gerenciamento é possível consolidar várias tarefas ou operações em uma única unidade computacional.
As tarefas podem ser agrupadas de acordo com os critérios baseados nos recursos fornecidos pelo ambiente e os custos associados a esses recursos. Uma abordagem comum é procurar tarefas que tenham um perfil semelhante em relação aos requisitos de processamento, tempo de vida e escalabilidade. Agrupar esses juntos permite que eles escalem como uma unidade. A elasticidade fornecida por muitos ambientes de nuvem permite que instâncias adicionais de uma unidade computacional sejam iniciadas e encerradas de acordo com a carga de trabalho. Por exemplo, o Azure fornece dimensionamento automático que pode ser aplicado a Serviços de Aplicativos e Conjuntos de Dimensionamento de Máquinas Virtuais. Para obter mais informações, consulte Diretrizes de dimensionamento automático.
Como um exemplo de contador para mostrar como a escalabilidade pode ser utilizada para determinar quais operações não devem ser agrupadas, considere as duas tarefas a seguir:
- A Tarefa 1 pesquisa mensagens infrequentes e indiferentes ao tempo enviadas para uma fila.
- A Tarefa 2 trata disparos de alto volume de tráfego de rede.
A segunda tarefa requer elasticidade que pode envolver iniciar e parar um grande número de instâncias da unidade computacional. A aplicação da mesma escala para a primeira tarefa resultaria em mais tarefas escutando mensagens infrequentes na mesma fila e um desperdício de recursos.
Em muitos ambientes de nuvem, é possível especificar os recursos disponíveis para uma unidade computacional em termos do número de núcleos de CPU, memória, espaço em disco e, assim por diante. Geralmente, quanto mais recursos forem especificados, maior será o custo. Para economizar dinheiro, é importante maximizar o trabalho que uma unidade computacional de custo elevado desempenha e não deixá-lo ficar inativo durante um período prolongado.
Se houver tarefas que exigem uma grande quantidade de energia da CPU em disparos curtos, considere consolidá-las em uma única unidade computacional que forneça a energia necessária. No entanto, é importante equilibrar essa necessidade para manter os recursos caros ocupados em relação à contenção que pode ocorrer se eles estiverem com carga excessiva. As tarefas de uso intensivo e computacional de longa duração não devem compartilhar a mesma unidade computacional, por exemplo.
Problemas e considerações
Considere os seguintes pontos ao implementar esse padrão:
Escalabilidade e elasticidade. Muitas soluções na nuvem implementam escalabilidade e elasticidade ao nível da unidade computacional iniciando e encerrando instâncias de unidades. Evite agrupar tarefas que tenham requisitos de escalabilidade conflitantes na mesma unidade computacional.
Tempo de vida. A infraestrutura de nuvem recicla periodicamente o ambiente virtual que hospeda uma unidade computacional. Quando houver muitas tarefas de execução longa em uma unidade computacional, poderá ser necessário configurar a unidade para evitar que seja reciclada até que essas tarefas tenham terminado. Alternativamente, crie as tarefas utilizando uma abordagem de verificação de pontos que permitirá parar corretamente e continuar no ponto em que foram interrompidas quando a unidade computacional for reiniciada.
Cadência de lançamento. Se a implementação ou configuração de uma tarefa for alterada com frequência, poderá ser necessário parar a unidade computacional hospedando o código atualizado, reconfigurar e reimplantar a unidade e reiniciá-la. Esse processo também exigirá que todas as outras tarefas dentro da mesma unidade computacional sejam encerradas, redistribuídas e reiniciadas.
Segurança. Tarefas na mesma unidade computacional podem compartilhar o mesmo contexto de segurança e acessar os mesmos recursos. Deve haver um alto grau de confiança entre as tarefas e a confiança de que uma tarefa não irá corromper ou prejudicar outra. Além disso, aumentar o número de tarefas em execução em uma unidade computacional aumentará a superfície de ataque da unidade. Cada tarefa é tão segura quanto a que possui mais vulnerabilidades.
Tolerância a falhas. Se uma tarefa em uma unidade computacional falhar ou se comportar de maneira anormal, isso poderá afetar as outras tarefas em execução na mesma unidade. Por exemplo, se uma tarefa não for iniciada corretamente, isso poderá provocar falha em toda a lógica de inicialização na unidade computacional e evitar que outras tarefas na mesma unidade sejam executadas.
Contenção. Evite introduzir contenção entre tarefas que competem por recursos na mesma unidade computacional. Idealmente, tarefas que compartilham a mesma unidade computacional devem exibir características de utilização de recursos diferentes. Por exemplo, duas tarefas intensivas em computação provavelmente não devem residir na mesma unidade computacional e, tampouco, duas tarefas que consomem grandes quantidades de memória. No entanto, combinar uma tarefa intensiva de computação com uma tarefa que exige uma grande quantidade de memória é uma combinação viável.
Observação
Considere consolidar recursos de computação apenas para um sistema que esteja em produção por um período de tempo, de modo que os operadores e desenvolvedores possam monitorar o sistema e criar um mapa de calor que identifica como cada tarefa utiliza diferentes recursos. Este mapa pode ser utilizado para determinar quais tarefas são boas candidatas a compartilhar recursos de computação.
Complexidade. Combinar várias tarefas em uma única unidade computacional adiciona complexidade ao código na unidade, possivelmente tornando mais difícil testar, depurar e manter.
Arquitetura lógica estável. Desenhe e implemente o código em cada tarefa para que não precise alterar, mesmo que o ambiente físico em que a tarefa executa seja alterado.
Outras estratégias. A consolidação de recursos de computação é apenas uma maneira de ajudar a reduzir custos associados à execução de várias tarefas simultaneamente. Isso requer um planejamento cuidadoso e monitoramento para garantir que continue sendo uma abordagem efetiva. Outras estratégias podem ser mais apropriadas, dependendo da natureza do trabalho e onde os usuários dessas tarefas em execução estão localizados. Por exemplo, a decomposição funcional da carga de trabalho (conforme descrito pela Diretrizes de particionamento de computação) pode ser uma opção melhor.
Quando usar esse padrão
Utilize esse padrão para tarefas que não são eficazes em termos de custos, caso executem em suas próprias unidades computacionais. Se uma tarefa gasta muito do seu tempo ocioso, executar essa tarefa em uma unidade dedicada poderá ser caro.
Esse padrão pode não ser adequado para tarefas que realizam operações críticas de tolerância a falhas ou tarefas que processam dados altamente sensíveis ou privados e exigem seu próprio contexto de segurança. Essas tarefas devem ser executadas em seu próprio ambiente isolado, em uma unidade computacional separada.
Design de carga de trabalho
Um arquiteto deve avaliar como o padrão Consolidação de Recursos de Computação pode ser usado no design das suas cargas de trabalho para abordar os objetivos e os princípios discutidos nos do Azure Well-Architected Framework. Por exemplo:
Pilar | Como esse padrão apoia os objetivos do pilar |
---|---|
A otimização de custos se concentra em sustentar e melhorar o retorno sobre o investimento da sua carga de trabalho. | Esse padrão maximiza a utilização de recursos de computação, evitando capacidade provisionada não utilizada por meio da agregação de componentes ou até mesmo de cargas de trabalho inteiras em uma infraestrutura em pool. - CO:14 Consolidação |
A Excelência Operacional ajuda a fornecer qualidade na carga de trabalho por meio de processos padronizados e coesão da equipe. | A consolidação pode levar a uma plataforma de computação mais homogênea, que pode simplificar o gerenciamento e a observabilidade, reduzir abordagens distintas para tarefas operacionais e reduzir a quantidade de ferramentas necessárias. - OE:07 Sistema de monitoramento - OE:10 Design de automação |
A eficiência de desempenho ajuda sua carga de trabalho a atender com eficiência às demandas por meio de otimizações em dimensionamento, dados e código. | A consolidação maximiza a utilização dos recursos de computação usando a capacidade sobressalente do nó e reduzindo a necessidade de superprovisionamento. Grandes instâncias de computação (escaladas verticalmente) são frequentemente usadas no pool de recursos para essas infraestruturas. - PE:02 Planejamento de capacidade - PE:03 Seleção de serviços |
Tal como acontece com qualquer decisão de design, considere quaisquer compensações em relação aos objetivos dos outros pilares que possam ser introduzidos com este padrão.
Escolhas de plataforma de aplicativos
Este padrão pode ser alcançado de maneiras diferentes, dependendo do serviço de computação que você usa. Veja os seguintes serviços de exemplo:
- Serviço de Aplicativo do Azure e Azure Functions: implantar planos de Serviço de Aplicativo compartilhados, que representam a infraestrutura do servidor de hospedagem. Um ou mais aplicativos podem ser configurados para ser executado nos mesmos recursos de computação (ou no mesmo plano de Serviço de Aplicativo).
- Aplicativos de Contêiner do Azure: implante aplicativos de contêiner nos mesmos ambientes compartilhados, especialmente em situações em que você precisa gerenciar serviços relacionados ou precisa implantar aplicativos diferentes na mesma rede virtual.
- AKS (Serviço de Kubernetes do Azure): o AKS é uma infraestrutura de hospedagem baseada em contêiner na qual vários aplicativos ou componentes de aplicativo podem ser configurados para serem executados em co-localização nos mesmos recursos de computação (nós) agrupados por requisitos computacionais, como CPU ou necessidades de memória (pools de nós).
- Máquinas virtuais: implante um único conjunto de máquinas virtuais para todos os locatários usarem. Dessa forma, os custos de gerenciamento são compartilhados entre os locatários. Conjuntos de Dimensionamento de Máquinas Virtuais é um recurso que dá suporte ao gerenciamento de recursos compartilhados, balanceamento de carga e dimensionamento horizontal de Máquinas Virtuais.
Recursos relacionados
Os padrões e diretrizes a seguir também podem ser relevantes ao implementar esse padrão:
Diretrizes de dimensionamento automático. O dimensionamento automático pode ser utilizado para iniciar e interromper instâncias de recursos computacionais de host de serviço, dependendo da demanda antecipada para processamento.
Diretrizes de particionamento de computação. Descreve como alocar os serviços e componentes em um serviço de nuvem de forma a ajudar a minimizar os custos de execução, mantendo a escalabilidade, o desempenho, a disponibilidade e a segurança do serviço.
Abordagens de arquitetura para computação em soluções de multilocatário. Fornece diretrizes sobre considerações e requisitos essenciais para os arquitetos de solução, quando eles estão planejando os serviços de computação de uma solução multilocatário.