Partilhar via


Modelo de Maturidade de Fiabilidade

A jornada 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. Este modelo de maturidade destina-se a ajudá-lo a avaliar o seu estado atual e oferecer um caminho estruturado para a melhoria.

A fundação começa por desenvolver as funcionalidades básicas de confiabilidade oferecidas pelo Azure, aproveitando funcionalidades de confiabilidade integradas do Azure, como a redundância de zona, para melhorias imediatas sem a necessidade de uma otimização extensiva.

Contraintuitivamente, a maneira de alcançar alta confiabilidade é aceitar que as 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 merecem ser abordados de forma proativa. 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 equipas implementam modelagem de saúde, conduzem análise de modos de falha e preparam planos abrangentes de recuperação de desastres. Esta etapa garante a responsabilização através de objetivos mensuráveis e preparação sistemática para vários cenários de falha.

Depois que o sistema estiver ativo, a ênfase passa a ser o gerenciamento dos 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 corre indefinidamente, e manter-se resiliente é o seu objetivo. Este nível representa a evolução para além dos controlos técnicos para a adaptabilidade arquitetónica. Este nível concentra-se em permitir que os sistemas resistam a riscos novos e imprevistos à medida que as cargas de trabalho evoluem e crescem.

O modelo está estruturado em cinco níveis de maturidade distintos, cada um com um objetivo principal e um conjunto de estratégias centrais. Utilize as vistas com separadores abaixo para explorar cada nível. Certifique-se também de analisar as compensações destacadas e os riscos associados à medida que progride.

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

O nível 1 do modelo de maturidade foi projetado para ajudar as equipes de carga de trabalho a construir uma base sólida para a confiabilidade do sistema. O foco está no bootstrapping, que é o processo de estabelecer as bases para decisões futuras de confiabilidade. Esta etapa envolve principalmente a implementação funcional com pequenas extensões às práticas atuais.

Esta etapa inclui pesquisar, obter insights e criar um inventário de seus sistemas. Ele também usa recursos de confiabilidade internos no Azure, como habilitar redundância de zona para melhorias imediatas.

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

Estratégias-chave

✓ Avaliar oportunidades de descarga de responsabilidade operacional

Esta estratégia é fundamentalmente uma abordagem de construção versus uma abordagem de compra ou confiança . A decisão depende de quanta responsabilidade é gerível nesta fase, ao mesmo tempo que apoia o desenvolvimento futuro. Você deseja usar recursos que são relevantes para a carga de trabalho, mas deve sempre explorar oportunidades para delegar ou aliviar a manutenção desses recursos. Aqui estão alguns casos de uso clássicos em que você pode querer aplicar essa abordagem.

  • Transfira responsabilidades para a plataforma de nuvem escolhendo soluções de plataforma como serviço (PaaS). Eles fornecem soluções prontas para necessidades comuns de resiliência, como replicação, failover e armazenamentos de backup. Quando você adota 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 aspetos por conta própria, o que pode ser demorado e complexo.

  • Delegar responsabilidades para operações que não estão diretamente ligadas aos objetivos empresariais do fluxo de trabalho. Algumas operações especializadas, como gerenciamento e segurança de banco de dados, podem potencialmente afetar a confiabilidade de sua carga de trabalho. Explore a possibilidade de ter equipes experientes, tecnologia ou ambas para lidar com essas tarefas.

    Por exemplo, se sua equipe não tiver experiência em 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, pois permite que sua equipe se concentre na funcionalidade da carga de trabalho. Muitas empresas partilharam serviços geridos centralmente. Se as equipes da 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ê pode tomar uma decisão explícita de usar suas habilidades e selecionar serviços que não incluam recursos de gerenciamento.

  • Transferir responsabilidades para fornecedores que não são da Microsoft. Escolha produtos prontos a usar como ponto de partida. Crie soluções personalizadas apenas quando elas contribuírem para o valor comercial da sua carga de trabalho.

Risco: Se a opção comprar ou confiar 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", onde atualizações e modernização se tornam impraticáveis. Analise regularmente seus requisitos e compare-os com os recursos da solução. Desenvolver 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 confiança possa parecer mais simples no início, ela pode exigir uma reavaliação e redesenho posterior se as limitações do serviço PaaS, da solução do fornecedor ou dos recursos de propriedade da plataforma não atenderem à granularidade ou ao nível de autonomia necessários para a carga de trabalho.

✓ Identificar os fluxos críticos de usuários e sistemas

Nesta fase, é crucial dividir a carga de trabalho em fluxos. Foco 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 os componentes da 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 realizam atividades de front-end, como navegação e pedidos. Enquanto isso, as transações de back-end e os processos acionados pelo sistema atendem às solicitações dos usuários e lidam com outras tarefas. Esses fluxos distintos fazem parte do mesmo sistema, mas envolvem componentes diferentes e servem finalidades diferentes.

Comece a construir um catálogo de fluxos nesta etapa. Observe as interações do usuário e a comunicação dos componentes. Liste e categorize fluxos, defina seus pontos de início e fim e observe as dependências. Documente resultados e exceções usando diagramas para maior clareza. Este catálogo pode servir como uma ferramenta importante para a conversa inicial com as partes interessadas do negócio para identificar os aspetos mais importantes a partir de sua perspetiva. Esta conversa pode informar o primeiro nível de priorização.

Classifique um fluxo como crítico, avaliando o risco e o impacto nas principais atividades de negócios. Se espera uma interrupção, a degradação suave foca em manter esses fluxos críticos. No exemplo do e-commerce, os fluxos críticos incluem pesquisas de produtos, adição de itens ao carrinho e checkout, porque essas tarefas são essenciais para os negócios. Outros processos, como a atualização de dados de produtos e a manutenção de imagens de produtos, não são tão críticos. Certifique-se de que os fluxos críticos permaneçam operacionais durante uma interrupção para evitar perda de receita, permitindo que os usuários continuem pesquisando 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 não seja necessário apresentar dados para uma auditoria imediatamente. O processo continua sendo importante, mas sua confiabilidade não é crítica em termos de tempo porque a recuperação em poucas 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 certas

Deve aplicar esta estratégia aos seguintes níveis:

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

    Você também deve definir limites que criem 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 computação e armazenamento de dados e usar serviços dedicados.

    Atenção

    Em cenários de migração, adotar uma abordagem de elevação e mudança sem analisar novas oportunidades pode levar à perda de benefícios e ineficiências. É importante pesquisar a modernização cedo 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 o seu design. Escolha componentes que atendam às suas necessidades atuais, mas que permaneçam flexíveis para que você possa mudar de serviço à medida que sua carga de trabalho evolui e requer mais recursos.

  • SKUs ou camadas nos serviços do Azure: Analise 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.

  • Características que suportam a fiabilidade: Escolha serviços nativos da nuvem para melhorar a disponibilidade através de configurações simples sem alterar o código. É importante entender as opções e selecionar intencionalmente as configurações, como aumentar a redundância de zona ou replicar dados para uma região secundária.

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

Dentro de cada parte da sua 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 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 distribuir essas instâncias em vários datacenters do Azure. Se não o fizer, pelo menos garanta redundância local, mas este método apresenta um risco mais elevado. 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.

Compromisso: Um compromisso significativo é 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 degradar 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 com baixa latência, o uso de zonas de disponibilidade poderá interromper seu desempenho.

✓ Habilite 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. Utilize funcionalidades incorporadas para definir alertas para potenciais problemas. Você deve ter alertas básicos para enviar notificações e receber alertas. Aproveite os recursos da plataforma Azure que indicam alterações no status de integridade dos serviços, como:

Configure os grupos de ação do Azure Monitor para a infraestrutura e o aplicativo.

Compensação: À medida que você coleta mais logs, precisa 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 espaço de trabalho. Para obter mais informações, consulte Recomendações de configuração para confiabilidade.

Comece a construir observabilidade nas camadas a seguir.

Infraestrutura

Comece habilitando os logs de diagnóstico e certificando-se de que você reúna métricas nativas dos componentes da plataforma para análise. Reúna informações sobre o uso de recursos, como CPU, memória, entrada/saída e atividade de rede.

Aplicação

Colete métricas no nível do aplicativo, como consumo de memória ou latência de solicitação, e registre atividades do aplicativo. Faça operações de registo em uma thread ou processo separado da thread principal da aplicação. Essa abordagem não faz com que o registro em log diminua a velocidade das tarefas principais do aplicativo.

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

Dados

Para monitorar bancos de dados em um nível básico, colete métricas-chave que os recursos do banco de dados emitem. Semelhante aos componentes de infraestrutura, rastreie o uso de recursos no contexto de armazenamentos de dados, como métricas de rede. A recolha de dados sobre a forma como as ligações são agrupadas é importante para melhorar a eficiência em fases posteriores.

Para obter confiabilidade, é importante rastrear as métricas de conexão, como o monitoramento de 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 construir um manual de mitigação de falhas

As falhas variam de falhas intermitentes a falhas transitórias ligeiramente prolongadas e interrupções catastróficas.

No Nível 1, concentre-se em falhas de plataforma. Mesmo que eles estejam além 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 ao nível da plataforma e lide com elas na 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 é essencialmente teórico e amadurece com a automatização a níveis posteriores.

Você deve documentar as falhas, incluindo fatores como sua probabilidade, impacto e estratégias de mitigação. Use uma escala de criticidade que esteja alinhada com os objetivos da sua carga de trabalho. Sua escala pode incluir:

  • Alta Uma interrupção completa do sistema que resulta em perdas financeiras significativas e um declínio na confiança do usuário.

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

  • Baixo Um pequeno problema de software que afeta um recurso não essencial do aplicativo e causa tempo de inatividade mínimo para os usuários.

Aqui está 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 Azure Alto Muito provável Use padrões de projeto na lógica do lado do cliente, como lógica de repetição e disjuntores.
Falha na zona O usuário não pode acessar o aplicativo. Plataforma Azure Alto Pouco 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 Alto Provável Use o gerenciamento automatizado de certificados TLS.
O uso de CPU ou memória atinge limites definidos e faz com que o servidor falhe. Os pedidos expiram. Aplicação Médio Provável Implemente reinicializações automáticas.
O componente não está disponível durante uma atualização. O usuário enfrenta um erro não tratado no aplicativo. Implantação ou alteração na configuração Baixo Altamente provável durante implantações e não provável em outros momentos Manipule componentes na lógica do lado do cliente.

No Nível 1, não se esforce pela perfeição, pois sempre podem ocorrer casos de falhas imprevistas. Se ocorrer interrupções inesperadas, documente as causas e atenuações no manual. Trate esse ativo como um documento dinâmico que você atualiza ao longo do tempo.

✓ Adicionar mecanismos para 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 e configurações internas para lidar com essas falhas e 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 oferecem suporte à confiabilidade.

Problemas persistentes 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 a correção de problemas localizados dentro do aplicativo. Envolve examinar os fluxos críticos de usuários e sistemas do sistema e adicionar técnicas de autopreservação e esforços de recuperação. Estes 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 funcionalidades e configurações.

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

Risco: Os testes geralmente introduzem atrito no ciclo de desenvolvimento. Para mitigar esse risco, torne os testes de confiabilidade rastreáveis juntamente com as tarefas de desenvolvimento.

O desenvolvimento de funcionalidades é a prioridade, e os testes podem criar fricção no ciclo de desenvolvimento. É mais fácil começar a testar antes que o desenvolvimento de recursos seja concluído. Projetar aspetos não funcionais do aplicativo no início permite estendê-los à medida que adiciona recursos funcionais, em vez de criar uma lista de pendências de problemas para resolver mais tarde. Embora essa abordagem exija mais esforço inicialmente, ela é gerenciável e evita problemas maiores mais tarde.

Próximos passos