Compartilhar via


Princípios de design de confiabilidade

Interrupções e defeitos são sérias preocupações para todas as cargas de trabalho. Uma carga de trabalho confiável deve sobreviver a esses eventos e continuar a fornecer consistentemente sua funcionalidade pretendida. Ele deve ser resiliente para que possa detectar e suportar falhas enquanto continua operando. Ele deve ser recuperável para que, se uma interrupção exceder as medidas de resiliência, a carga de trabalho possa ser restaurada dentro das metas de recuperação acordadas. Ele também deve estar disponível para que os usuários possam acessar a carga de trabalho durante o período de tempo prometido no nível de qualidade prometido.

Não é realista assumir que falhas não ocorrerão, especialmente quando a carga de trabalho é criada para ser executada em sistemas distribuídos. Alguns componentes podem falhar enquanto outros continuam operando. Em algum momento, a experiência do usuário pode ser afetada, o que compromete as metas de negócios.

As arquiteturas de carga de trabalho devem ter garantias de confiabilidade no código do aplicativo, na infraestrutura e nas operações. As opções de design não devem alterar a intenção especificada pelos requisitos de negócios. Essas alterações devem ser consideradas compensações significativas.

Os princípios de design destinam-se a fornecer diretrizes para aspectos de confiabilidade que você deve considerar durante todo o ciclo de vida de desenvolvimento. Comece com as abordagens recomendadas e justifique os benefícios para um conjunto de requisitos. Depois de definir sua estratégia, conduza ações usando a lista de verificação de confiabilidade.

Se você não aplicar esses princípios ao seu design, a carga de trabalho provavelmente não estará preparada para prever ou lidar com problemas na produção. O resultado pode ser interrupções no serviço que levam a perdas financeiras. No caso de cargas de trabalho críticas, não aplicar esses princípios pode comprometer a segurança.

Design para requisitos de negócios

Ícone de meta Obtenha clareza sobre o escopo da carga de trabalho, o crescimento de usuários e, mais importante, as promessas que a equipe fez a clientes externos e partes interessadas internas.

O design não é um trabalho de adivinhação baseado em resultados indefinidos ou vagos. A confiabilidade requer uma atividade deliberada que obtém alinhamento sobre a experiência do usuário aceitável, restrições de design, o que define o sucesso e como ele é medido.

Defina metas claras, alcançáveis e documentadas, negociadas com os stakeholders empresariais e fundamentadas em um investimento e previsão realistas. Esses requisitos informarão diretamente suas escolhas de arquitetura, desde estratégias de resiliência até ferramentas de observabilidade e planos de dimensionamento.

Abordagem Benefício
Concentre-se na coleta de informações necessárias para definir o escopo e a profundidade da solução. Esclareça as restrições que influenciam as metas de negócios. Comece com perguntas de alto nível, como:

- Que nível de resiliência, recuperação, observabilidade e simplicidade são necessários?
- Há restrições definidas relacionadas a custo, conformidade, geografia ou latência?

Com base nessas informações, documente o que é bom e simples de alcançar.
Compreender metas e limites evitará a adivinhação. Caso contrário, você poderá ficar preso em um loop de design iterativo, resultando em esforços desperdiçados e custos desnecessários.
Orientar a tomada de decisões traduzindo metas de negócios em uma compreensão compartilhada das compensações arquitetônicas dentro das limitações reais. Apresente opções que impactam:

- Custo financeiro
– Complexidade da engenharia
- Considerações de segurança
- Sobrecarga operacional
Isso ajudará as partes interessadas a entender o custo, a complexidade e as implicações operacionais de suas solicitações e guiá-las para resultados realistas e alinhados.
Priorizar a definição de resultados de confiabilidade para cada fluxo de usuário crítico em vez de medidas genéricas, como o tempo de atividade.

Identifique os recursos e fluxos voltados para o usuário por meio do sistema e, para cada um deles, avalie seu valor comercial, padrões de uso e requisitos de resiliência. Conduza o consenso no nível do fluxo para garantir que as decisões de design permaneçam alinhadas às metas de negócios.
Essa conversa ajuda a afastar os stakeholders de declarações insustentáveis, como "o site deve estar sempre disponível", para expectativas práticas e alcançáveis ligadas à funcionalidade real e aos resultados. Esses resultados ajudam a estabelecer o que é resolvido com a tecnologia e o que pode ser resolvido com planos adicionais de continuidade de negócios.
Oriente as escolhas de design em função dos horizontes temporais.

Defina as expectativas de uso com previsão realista. Por exemplo, qual é a carga de usuário esperada no início? Espera-se que o crescimento do usuário seja linear, exponencial ou incerto.
Essas informações ajudarão você a criar uma arquitetura que atenderá às necessidades de confiabilidade de curto prazo, evitando decisões de design que exigirão um retrabalho significativo para lidar com horizontes futuros. Essa abordagem afeta como pensar sobre elasticidade, fluxos de trabalho controlados por eventos e permite que você faça escolhas estratégicas sobre qual dívida técnica incorrer ou evitar.
Fator em dependências que podem limitar a autonomia do design, como restrições organizacionais.

Esteja ciente da infraestrutura centralizada, dos mandatos de segurança, das políticas de roteamento de rede ou das decisões de plataforma que afetam diretamente o que você pode prometer em termos de resiliência, disponibilidade e recuperação.
Entender sua dependência de serviços fora do controle ajuda você a projetar com expectativas realistas de confiabilidade. Ele garante que suas metas de RTO/RPO e SLOs sejam alcançáveis e claramente comunicadas, evitando promessas excessivas e reduzindo surpresas.

Design para resiliência

Ícone de meta A carga de trabalho deve continuar a operar com funcionalidade completa ou reduzida.

Você deve esperar que falhas de componente, interrupções de plataforma, degradações de desempenho, disponibilidade limitada de recursos e outras falhas ocorram. Crie resiliência no sistema para que ele seja tolerante a falhas e possa se degradar normalmente.

Abordagem Benefício
Distingue os componentes que estão no caminho crítico daqueles que podem funcionar em um estado degradado. Nem todos os componentes da carga de trabalho precisam ser igualmente confiáveis. Determinar a criticidade ajuda você a projetar de acordo com a criticidade de cada componente. Você não projetará excessivamente a resiliência para componentes que possam deteriorar ligeiramente a experiência do usuário, diferentemente de componentes que podem causar problemas de ponta a ponta se falharem.

O design pode ser eficiente na alocação de recursos para componentes críticos. Você também pode implementar estratégias de isolamento de falhas para que, se um componente não crítico falhar ou entrar em um estado degradado, ele possa ser isolado para evitar falhas em cascata.
Identifique possíveis pontos de falha no sistema, especialmente para os componentes críticos, e determine o efeito nos fluxos do usuário. Você pode analisar os casos de falha, o raio de explosão e a intensidade da falha: interrupção total ou parcial. Essa análise influencia o design das funcionalidades de tratamento de erros no nível do componente.
Crie recursos de autopreservação usando padrões de design corretamente e modularizando o design para isolar falhas. O sistema poderá evitar que um problema afete componentes downstream. O sistema poderá atenuar falhas transitórias e permanentes, gargalos de desempenho e outros problemas que possam afetar a confiabilidade.

Você também poderá minimizar o raio da explosão.
Adicione a capacidade de dimensionar os componentes críticos (aplicativo e infraestrutura) considerando as restrições de capacidade dos serviços nas regiões com suporte. A carga de trabalho será capaz de lidar com picos e flutuações de capacidade variável. Essa funcionalidade é crucial quando há uma carga inesperada no sistema, como um aumento no uso válido. Se a carga de trabalho for projetada para escalar horizontalmente em várias regiões, ela poderá até mesmo superar possíveis restrições de capacidade de recursos temporários ou outros problemas que afetam em uma única região.
Crie redundância em camadas e resiliência em várias camadas de aplicativo.

Procure redundância em infraestruturas físicas e replicação imediata de dados. Também visa redundância na camada funcional que abrange serviços, operações e pessoal.
A redundância ajuda a minimizar pontos únicos de falha. Por exemplo, se houver uma interrupção em um componente, zona ou região, a implantação redundante (em ativo-ativo ou ativo-passivo) permitirá que você atenda às metas de tempo de atividade.

A adição de intermediários impede a dependência direta entre componentes e melhora o buffer. Ambos os benefícios endurecem a resiliência do sistema.
Sobrerrovisionar para atenuar imediatamente a falha individual de instâncias redundantes e servir como um buffer contra o consumo excessivo de recursos. O maior investimento em superprovisionamento aumenta a resiliência.

O sistema continuará operando em capacidade total durante uma falha ativa antes mesmo que as operações de dimensionamento possam começar a remediar a falha. Da mesma forma, você pode reduzir o risco de consumo inesperado de recursos descontrolados, garantindo o uso do seu buffer planejado e ganhando tempo crítico para triagem, antes que ocorram falhas no sistema ou escalonamento agressivo.

Design para recuperação

Ícone de meta A carga de trabalho deve ser capaz de prever e se recuperar da maioria das falhas, de todas as magnitudes, com interrupção mínima para a experiência do usuário e os objetivos de negócios.

Mesmo sistemas altamente resilientes precisam de abordagens de preparação para desastres, tanto em operações de design de arquitetura quanto de carga de trabalho. Na camada de dados, você deve ter estratégias que possam reparar o estado da carga de trabalho em caso de corrupção.

Abordagem Benefício
Estruturaram, testaram e documentaram planos de recuperação alinhados com as metas de recuperação negociadas. Os planos devem abranger todos os componentes, além do sistema como um todo. Um processo bem definido leva a uma recuperação rápida que pode evitar impacto negativo nas finanças e na reputação de sua empresa. A realização de drills de recuperação regulares testam o processo de recuperação de componentes do sistema, dados e etapas de failover e failback para evitar confusão quando o tempo e a integridade dos dados são as principais medidas de sucesso.
Verifique se você pode reparar dados de todos os componentes com estado dentro de seus destinos de recuperação. Os backups são essenciais para levar o sistema de volta a um estado de trabalho usando um ponto de recuperação confiável, como o último estado bom conhecido.

Backups imutáveis e transacionalmente consistentes garantem que os dados não possam ser alterados e que os dados restaurados não estejam corrompidos.
Implemente recursos automatizados de auto-recuperação no design. Essa automação reduz os riscos de fatores externos, como a intervenção humana, e reduz o ciclo de resolução de falhas.
Substitua componentes sem estado por unidades efêmeras imutáveis. A criação de unidades efêmeras que você pode inicializar e destruir sob demanda fornece repetibilidade e consistência. Use modelos de implantação lado a lado para fazer a transição para as novas unidades incrementais, minimizando interrupções.

Projetar para operações

Ícone de meta Deslocar para a esquerda nas operações para prever condições de falha.

Teste falhas precoces e frequentemente no ciclo de vida de desenvolvimento e determine o impacto do desempenho na confiabilidade. Para fins de análise de causa raiz e post-mortem, você precisa ter visibilidade compartilhada, entre equipes, de status de dependência e falhas contínuas. Insights, diagnósticos e alertas provenientes de sistemas observáveis são fundamentais para um gerenciamento eficaz de incidentes e melhoria contínua.

Abordagem Benefício
Crie sistemas observáveis que possam correlacionar a telemetria. Monitoramento e diagnóstico são operações cruciais. Se algo falhar, você precisa saber que falhou, quando falhou e por que falhou. A observabilidade no nível do componente é fundamental, mas a observabilidade agregada de componentes e fluxos de usuário correlacionados fornece uma visão holística do estado de saúde. Esses dados são necessários para permitir que os engenheiros de confiabilidade do site priorizem seus esforços para correção.
Prever possíveis defeitos e comportamento anômalo. Torne as falhas de confiabilidade ativas visíveis usando alertas priorizados e acionáveis.

Invista em processos e infraestrutura confiáveis, que levem a uma triagem mais rápida.
Os engenheiros de confiabilidade do site podem ser notificados imediatamente para que possam atenuar os incidentes contínuos do site ao vivo e reduzir proativamente possíveis falhas identificadas por alertas preditivos antes de se tornarem incidentes ao vivo.
Simule falhas e execute testes em ambientes de produção e pré-produção. É benéfico experimentar falhas na produção para que você possa definir expectativas realistas de recuperação. Isso permite que você faça escolhas de design que respondam normalmente a falhas. Além disso, permite testar os limites definidos para as métricas de negócios.
Crie componentes com a automação em mente e automatize o máximo possível. A automação minimiza o potencial de erro humano, trazendo consistência para testes, implantação e operações.
Considere operações de rotina e seu impacto na estabilidade do sistema. A carga de trabalho pode estar sujeita a operações em andamento, como revisões de aplicativo, auditorias de segurança e conformidade, atualizações de componentes e processos de backup. Examinar minuciosamente essas alterações garante a estabilidade do sistema.
Aprenda continuamente com incidentes em produção. Com base nos incidentes, você pode determinar o impacto e as supervisões no design e nas operações que podem passar despercebidas na pré-produção. Em última análise, você poderá conduzir melhorias com base em incidentes da vida real.

Mantenha-o simples

Ícone de meta Evite complicar demais o design da arquitetura, o código do aplicativo e as operações.

Muitas vezes é o que você remove em vez do que você adiciona que leva às soluções mais confiáveis. A simplicidade reduz a área de superfície para controle, minimizando ineficiências e possíveis configurações incorretas ou interações inesperadas. Por outro lado, a simplificação excessiva pode introduzir pontos únicos de falha. Mantenha uma abordagem equilibrada.

Abordagem Benefício
Adicione componentes à sua arquitetura somente se eles ajudarem você a alcançar valores comerciais de destino. Mantenha o caminho crítico enxuto. A criação de requisitos de negócios pode levar a uma solução simples que é fácil de implementar e gerenciar. Evite ter muitos componentes críticos, pois cada um deles é um ponto significativo de falha.
Estabeleça padrões em implementação, implantação e processos de código e documente-os. Identifique oportunidades para impor esses padrões usando validações automatizadas. Os padrões fornecem consistência e minimizam erros humanos. Abordagens como convenções de nomenclatura padrão e guias de estilo de código podem ajudá-lo a manter a qualidade e facilitar a identificação dos ativos durante a solução de problemas.
Verifique se as abordagens teóricas se traduzem em design pragmático que se aplica aos casos de uso. O código do aplicativo que é muito granular pode levar a interdependência desnecessária, operações extras e manutenção difícil.
Desenvolva código suficiente. Você poderá evitar problemas resultantes de implementações ineficientes, como consumo inesperado de recursos, falhas de fluxo de dados ou usuário e bugs de código.

Por outro lado, problemas de confiabilidade devem levar a revisões de código para garantir que o código seja resiliente o suficiente para lidar com os problemas.
Aproveite os recursos fornecidos pela plataforma e os ativos predefinidos que podem ajudá-lo a atender efetivamente às metas de negócios. Essa abordagem minimiza o tempo de desenvolvimento. Isso também permite que você confie em práticas já testadas e comprovadas que foram usadas com cargas de trabalho semelhantes.

Próximas etapas