Compartilhar via


Modelo de maturidade de confiabilidade

O percurso de confiabilidade é um processo passo a passo em que cada estágio se baseia no anterior para garantir que os sistemas permaneçam disponíveis e atendam às expectativas do usuário. Esse modelo de maturidade destina-se a ajudá-lo a avaliar seu estado atual e oferecer um caminho estruturado para aprimoramento.

A fundação começa por inicializar as capacidades básicas de confiabilidade oferecidas pelo Azure ao utilizar os recursos embutidos de confiabilidade do Azure, como a redundância de zona para melhorias imediatas sem a sobrecarga de uma otimização abrangente.

Contraintuitivamente, a maneira de obter alta confiabilidade é aceitar falhas são inevitáveis. Em vez de tentar evitar todos os problemas, é mais eficaz planejar como seu sistema responderá quando ocorrerem problemas. Seus requisitos de negócios ajudam a determinar quais riscos valem a pena lidar proativamente. As equipes investem em recursos avançados de monitoramento com observabilidade estruturada, estendem a mitigação de falhas para incluir preocupações no nível do aplicativo e começam a testar medidas de resiliência.

Em seguida, as equipes integram insights de negócios com habilidades técnicas. As equipes implementam a modelagem de saúde, conduzem a análise de modos de falha e preparam planos abrangentes de recuperação de desastres. Esse estágio garante a responsabilização por meio de objetivos mensuráveis e preparação sistemática para vários cenários de falha.

Depois que o sistema estiver ativo, a ênfase passará a gerenciar os desafios dos ambientes de produção, incluindo o gerenciamento de alterações e lidar com o crescimento de dados e a complexidade operacional e como eles afetam a confiabilidade do sistema.

O nível final é executado indefinidamente, e manter-se resiliente é o objetivo. Esse nível representa a evolução além dos controles técnicos para a adaptabilidade arquitetônica. Esse nível se concentra em permitir que os sistemas resistam a riscos novos e imprevistos à medida que as cargas de trabalho evoluem e crescem.

O modelo é estruturado em cinco níveis de maturidade distintos, cada um com uma meta primária e um conjunto de estratégias principais. Utilize as abas exibidas abaixo para explorar cada nível. Examine também as compensações realçadas e os riscos associados à medida que você progride.

Ícone de meta Estabelecer uma base sólida para resiliência em operações e infraestrutura de carga de trabalho, em vez de gastar tempo em tarefas de otimização.

O nível 1 do modelo de maturidade foi projetado para ajudar as equipes de carga de trabalho a criar uma base forte para a confiabilidade do sistema. O foco é na inicialização, que é o processo de configurar os fundamentos para futuras decisões de confiabilidade. Esse estágio envolve principalmente a implementação funcional com extensões secundárias às práticas atuais.

Esse estágio inclui a pesquisa, a obtenção de insights e a criação de um inventário de seus sistemas. Ele também usa recursos internos de confiabilidade no Azure, como habilitar a redundância de zona para melhorias imediatas.

Ao estabelecer esses conceitos básicos, você pode preparar sua equipe para avançar nos níveis do modelo de maturidade de confiabilidade para aprimorar progressivamente a resiliência e o desempenho do sistema.

Principais estratégias

✓ Avaliar oportunidades para descarregar a responsabilidade operacional

Essa estratégia é, essencialmente, um abordagem criar versus comprar ou depender. A decisão depende de quanta responsabilidade é gerenciável nesta fase, enquanto ainda dá suporte ao desenvolvimento futuro. Você quer usar recursos que sejam relevantes para a carga de trabalho, mas deve sempre explorar oportunidades para transferir sua manutenção. Aqui estão alguns casos de uso clássicos em que talvez você queira aplicar essa abordagem.

  • Descarregre as responsabilidades para a plataforma de nuvem escolhendo soluções paaS (plataforma como serviço). Eles fornecem soluções prontas para necessidades comuns de resiliência, como replicação, failover e repositórios de backup. Quando você usa essa abordagem, o provedor de nuvem lida com melhorias de hospedagem, manutenção e resiliência.

    Por exemplo, o provedor de nuvem replica dados em vários nós de computação e distribui as réplicas entre zonas de disponibilidade. Se você criar sua própria solução em máquinas virtuais (VMs), precisará gerenciar esses aspectos por conta própria, o que pode ser demorado e complexo.

  • Delegar responsabilidades operacionais que não têm ligação direta com os objetivos comerciais da carga de trabalho. Algumas operações especializadas, como gerenciamento de banco de dados e segurança, podem afetar potencialmente a confiabilidade da carga de trabalho. Explore a possibilidade de ter equipes experientes, tecnologia ou ambas lidar com essas tarefas.

    Por exemplo, se sua equipe não tiver experiência no banco de dados, use serviços gerenciados para ajudar a transferir a responsabilidade para o provedor. Essa abordagem pode ser útil quando você começa porque permite que sua equipe se concentre na funcionalidade da carga de trabalho. Muitas empresas têm serviços compartilhados e gerenciados centralmente. Se as equipes de plataforma estiverem disponíveis, use-as para lidar com essas operações. No entanto, essa abordagem pode adicionar dependências e complexidade organizacional.

    Como alternativa, se sua equipe tiver a experiência certa, você poderá tomar uma decisão explícita de usar suas habilidades e selecionar serviços que não incluem recursos de gerenciamento.

  • Descarregar responsabilidades para fornecedores que não são da Microsoft. Escolha produtos fora da prateleira como ponto de partida. Crie soluções personalizadas somente quando elas contribuem para o valor comercial da carga de trabalho.

Risco: Se a opção comprar ou depender atender parcialmente aos seus requisitos, talvez seja necessário implementar extensões personalizadas. Esse método pode resultar em uma situação de "bloqueio de personalização", em que as atualizações e a modernização se tornam impraticáveis. Examine regularmente seus requisitos e compare-os com os recursos da solução. Desenvolva uma estratégia de saída para quando houver um desvio significativo entre os dois.

O cenário oposto também é um risco. Embora a opção de compra ou de confiança possa parecer mais simples no início, ela pode exigir a reavaliação e o redesenho posteriormente se as limitações do serviço paaS, solução de fornecedor ou recursos de propriedade da plataforma não atenderem à granularidade ou nível de autonomia necessários para a carga de trabalho.

✓ Identificar os fluxos críticos do usuário e do sistema

Dividir a carga de trabalho em fluxos é crucial neste estágio. Concentre-se nos fluxos do usuário e do sistema . Os fluxos de usuário determinam as interações do usuário e os fluxos do sistema determinam a comunicação entre componentes de carga de trabalho que não estão diretamente associados às tarefas do usuário.

Por exemplo, em um aplicativo de comércio eletrônico, os clientes executam atividades de front-end, como navegação e pedidos. Enquanto isso, as transações de back-end e os processos disparados pelo sistema atendem às solicitações do usuário e lidam com outras tarefas. Esses fluxos distintos fazem parte do mesmo sistema, mas envolvem componentes diferentes e servem a diferentes finalidades.

Comece a criar um catálogo de fluxos nesta fase. Observe as interações do usuário e a comunicação de componentes. Listar e categorizar fluxos, definir seus pontos de início e de término e observar dependências. Documente resultados e exceções usando diagramas para maior clareza. Esse catálogo pode servir como uma ferramenta importante para a conversa inicial com os stakeholders de negócios para identificar os aspectos mais importantes de sua perspectiva. Essa conversa pode informar o primeiro nível de priorização.

Classifique um fluxo como crítico avaliando o risco e o impacto nas atividades de negócios primárias. Se você espera uma interrupção, a degradação gradual concentra-se na manutenção desses fluxos críticos. No exemplo de comércio eletrônico, os fluxos críticos incluem pesquisas de produtos, adição de itens ao carrinho e check-out porque essas tarefas são essenciais para os negócios. Outros processos, como atualizar dados do produto e manter imagens de produtos, não são tão críticos. Verifique se os fluxos críticos permanecem operacionais durante uma interrupção para evitar a perda de receita, permitindo que os usuários continuem procurando produtos e adicionando itens ao carrinho.

Observação

Um processo de negócios pode ser crítico mesmo que não seja sensível ao tempo. A criticidade do tempo é um fator-chave. Por exemplo, atender aos requisitos de auditoria é um processo crítico, mas talvez você não precise apresentar dados para uma auditoria imediatamente. O processo permanece importante, mas sua confiabilidade não é crítica porque a recuperação dentro de algumas horas é aceitável.

Para obter mais informações, consulte Azure Well-Architected Framework: otimizar o design da carga de trabalho usando fluxos.

✓ Selecione o modelo de design, os recursos e as funcionalidades corretas

Você deve aplicar essa estratégia nos seguintes níveis:

  • Arquitetura: O design da carga de trabalho deve considerar as expectativas de confiabilidade em várias camadas de infraestrutura. Suas decisões iniciais podem ser a escolha entre a contêinerização ou o PaaS para hospedar o aplicativo. Ou você pode considerar modelos de rede como hub and spoke ou uma única rede virtual.

    Você também deve definir limites que criam segmentação com base na funcionalidade. Por exemplo, em vez de hospedar tudo em uma VM com um disco virtual de zona única, considere dividir a computação e o armazenamento de dados e usar serviços dedicados.

    Cuidado

    Em cenários de migração, adotar uma abordagem lift-and-shift sem examinar novas oportunidades pode resultar na perda de benefícios e em ineficiências. É importante pesquisar a modernização antecipadamente para evitar ficar preso a configurações difíceis de mudar e aproveitar melhores opções e melhorias.

  • Serviços do Azure: Use árvores de decisão para ajudá-lo a selecionar os serviços certos para seu design. Escolha componentes que atendam às suas necessidades atuais, mas permaneçam flexíveis para que você possa alternar de serviço à medida que sua carga de trabalho evolui e requer mais recursos.

  • SKUs ou camadas nos serviços do Azure: Examine os recursos de cada SKU e entenda as garantias de disponibilidade da plataforma. Avalie os contratos de nível de serviço para entender a cobertura fornecida em torno do percentil publicado.

  • Recursos que dão suporte à confiabilidade: Escolha serviços nativos de nuvem para aprimorar a disponibilidade por meio de configurações simples sem alterar o código. É importante entender as opções e selecionar configurações intencionalmente, como aumentar a redundância de zona ou replicar dados para uma região secundária.

✓ Implantar com um nível de redundância básico

Em cada parte da solução, evite pontos únicos de falha, como instâncias únicas. Em vez disso, crie várias instâncias para redundância. Os serviços do Azure geralmente lidam com redundância para você, especialmente com serviços de PaaS, que geralmente incluem redundância local por padrão e opções para atualização. De preferência, use a redundância de zona para espalhar essas instâncias em vários datacenters do Azure. Se você não fizer isso, pelo menos certifique-se de redundância local, mas esse método vem com maior risco. Em níveis futuros, você avalia se seus requisitos de confiabilidade podem ser atendidos estendendo a solução com componentes com redundância geográfica.

Prós e contras: uma contrapartida significativa é o aumento do custo da redundância. Além disso, a comunicação entre zonas pode introduzir latência. Para aplicativos herdados que exigem latência mínima, a redundância pode prejudicar o desempenho.

Risco: Se um aplicativo não for projetado para um ambiente de várias instâncias, ele poderá ter dificuldades com várias instâncias ativas, o que pode levar a dados inconsistentes. Além disso, se um aplicativo for criado para uma configuração local que tenha baixa latência, o uso de zonas de disponibilidade poderá interromper seu desempenho.

✓ Habilitar métricas, logs e rastreamentos para monitorar fluxos

Escolha ferramentas nativas da plataforma, como o Azure Monitor, para garantir a visibilidade de métricas, logs e rastreamentos. Use recursos internos para definir alertas para possíveis problemas. Você deve ter alertas básicos para enviar notificações e receber alertas. Aproveite os recursos da plataforma do Azure que indicam alterações no status de integridade dos serviços, como:

Configure grupos de ações do Azure Monitor para a infraestrutura e o aplicativo.

Prós e contras: à medida que você coleta mais logs, é necessário gerenciar o volume crescente, o que afeta os custos relacionados ao armazenamento desses logs. Use políticas de retenção para gerenciar o volume. Use o Azure Monitor para definir um limite diário em um workspace. Para obter mais informações, consulte As recomendações de configuração para confiabilidade.

Comece a criar observabilidade nas seguintes camadas.

Infraestrutura

Comece habilitando logs de diagnóstico e certificando-se de coletar métricas nativas de componentes da plataforma para análise. Colete informações sobre o uso de recursos, como CPU, memória, entrada/saída e atividade de rede.

Aplicação

Colete métricas em nível de aplicativo, como consumo de memória ou latência de solicitação, e registre atividades do aplicativo. Faça operações de log em um thread ou processo separado do thread principal do aplicativo. Essa abordagem não faz o logging desacelerar as tarefas principais do aplicativo.

Além disso, verifique os testes de disponibilidade básicos no Application Insights.

Dados

Para monitorar bancos de dados em um nível básico, colete as principais métricas que os recursos do banco de dados emitem. Semelhante aos componentes de infraestrutura, acompanhe o uso de recursos no contexto de armazenamentos de dados, como métricas de rede. Coletar dados sobre como as conexões são agrupadas é importante para melhorar a eficiência em estágios posteriores.

Para confiabilidade, é importante acompanhar as métricas de conexão, como monitorar conexões ativas e com falha. Por exemplo, no Azure Cosmos DB, um código de status 429 é retornado quando o número de solicitações excede as unidades de solicitação alocadas e as conexões começam a falhar.

✓ Comece a criar um guia estratégico de mitigação de falhas

As falhas variam de falhas intermitentes a um pouco prolongadas e interrupções catastróficas.

No Nível 1, concentre-se em falhas de plataforma. Mesmo que eles estejam fora do seu controle, você ainda deve ter estratégias para lidar com eles. Por exemplo, resolva interrupções zonais usando zonas de disponibilidade. Antecipe falhas transitórias no nível da plataforma e manipule-as em sua carga de trabalho.

O processo de tratamento dessas falhas varia de acordo com a complexidade. Comece a documentar possíveis falhas no nível da plataforma, seus riscos associados e estratégias de mitigação. Este exercício é principalmente teórico e amadurece com automação em níveis posteriores.

Você deve documentar falhas, incluindo fatores como suas estratégias de probabilidade, impacto e mitigação. Use uma escala de criticidade que se alinhe às metas da carga de trabalho. Sua escala pode incluir:

  • Alta. Uma interrupção completa do sistema que resulta em uma perda financeira significativa e uma queda na confiança do usuário.

  • Média. Uma interrupção temporária que afeta parte da carga de trabalho e causa inconveniência do usuário.

  • Baixa. Um pequeno problema de software que afeta um recurso não essencial do aplicativo e causa uma interrupção mínima para os usuários.

Este é um modelo de exemplo:

Problema Risco Fonte Severidade Probabilidade Atenuação
Falha de rede transitória O cliente perde a conexão com o servidor de aplicativos. Plataforma do Azure Alta Muito provavelmente Use padrões de projeto na lógica do lado do cliente, como lógica de tentativa e interrupções de circuito.
Interrupção em uma zona O usuário não pode acessar o aplicativo. Plataforma do Azure Alta Não é provável Habilite a resiliência de zona em todos os componentes.
Expiração do certificado TLS (Transport Layer Security) O cliente não pode estabelecer uma sessão TLS com o aplicativo. Erro humano Alta Provavelmente Use o gerenciamento automatizado de certificados TLS.
O uso de CPU ou memória atinge os limites definidos e faz com que o servidor falhe. Tempo limite das solicitações. Aplicação Médio Provavelmente Implementar reinicializações automáticas.
O componente não está disponível durante uma atualização. O usuário enfrenta um erro sem tratamento no aplicativo. Implantação ou alteração na configuração Baixo Altamente provável durante as implantações e provavelmente não em outras ocasiões Lidar com componentes na lógica do lado do cliente.

No Nível 1, não se esforce pela completude porque sempre há casos de falha imprevistos. Se você enfrentar interrupções inesperadas, documente as causas e ações de mitigação no manual. Trate esse ativo como um documento vivo que você atualiza ao longo do tempo.

✓ Adicionar mecanismos para se recuperar de falhas transitórias

Em um ambiente de nuvem, falhas transitórias são comuns. Eles indicam problemas de curto prazo que as novas tentativas geralmente podem resolver em segundos.

Use SDKs internos e configurações para lidar com essas falhas para manter o sistema ativo. As configurações internas geralmente são a configuração padrão, portanto, talvez seja necessário testar para validar a implementação. Além disso, implemente padrões projetados para lidar com falhas transitórias em sua arquitetura. Para obter mais informações, consulte padrões de design de arquitetura que dão suporte à confiabilidade.

Problemas resistentes podem indicar uma falha que não é transitória ou o início de uma interrupção. Esse cenário requer mais do que apenas corrigir problemas localizados dentro do aplicativo. Envolve examinar os fluxos críticos de usuário e do sistema e adicionar técnicas de autopreservação e esforços de recuperação. Esses métodos são práticas maduras que o Nível 2 descreve.

✓ Executar testes básicos

Integre testes básicos de confiabilidade nos estágios iniciais do ciclo de vida de desenvolvimento de software. Procure oportunidades para fazer testes, começando com testes de unidade para validar a funcionalidade e as configurações.

Além disso, desenvolva casos de teste simples para os problemas que você identifica no guia estratégico de mitigação de risco. Concentre-se em maior impacto, redução de mitigações de esforço. Por exemplo, simule interrupções de rede ou problemas de conectividade intermitente para ver como sua lógica de repetição resolve as interrupções.

Risco: O teste geralmente introduz atrito no ciclo de desenvolvimento. Para atenuar esse risco, torne o teste de confiabilidade rastreável junto com as tarefas de desenvolvimento.

O desenvolvimento de funcionalidades é a prioridade, e os testes podem introduzir fricção no ciclo de desenvolvimento. É mais fácil iniciar o teste antes que o desenvolvimento de funcionalidades seja concluído. Projetar aspectos não funcionais do aplicativo no início permite estendê-los à medida que você adiciona funcionalidades funcionais, em vez de criar uma lista de problemas a serem resolvidos posteriormente. Embora essa abordagem exija mais esforço inicialmente, ela é gerenciável e impede problemas maiores posteriormente.

Próximas etapas