TL; DR: criar redundante, modular; teste de disponibilidade; monitorar de perto.
Depois de perceber que a tentativa de extrair qualquer explicação pode demorar muito, escreverei todas as observações que fiz.
Questionando a premissa
Sistema de nuvem é panacéia
Mesmo que você opte totalmente pela nuvem, com um dos principais provedores de nuvem, ainda será necessário projetar seu aplicativo para resiliência. A AWS pode substituir sua VM, mas seu aplicativo deve ser capaz de reiniciar se for deixado no meio da computação.
Não queremos usar o sistema em nuvem, por causa de x / y / z
A menos que você seja uma organização muito grande, é melhor usar sistemas de nuvem. Os três principais sistemas em nuvem (AWS, MSFT, Google) empregam milhares de engenheiros para fornecer SLAs prometidos e o painel fácil de gerenciar. Na verdade, é uma boa pechincha usá-los, em vez de gastar um centavo com isso em casa.
Problemas no escopo e no design
Definir, quantificar e, em seguida, medir continuamente a disponibilidade de um serviço é um desafio maior do que escrever soluções para problemas de disponibilidade.
Definir e medir a 'disponibilidade' é mais difícil do que o esperado
Múltiplas partes interessadas têm uma visão diferente da disponibilidade, e o que pode acontecer é a definição preferida por uma pessoa com salário mais alto que outra definição. Às vezes, essa é a definição correta, mas geralmente o ecossistema não é construído para medir a mesma coisa, porque essa definição ideal é muito difícil de medir, e muito menos monitorar em tempo real. Se você tem uma definição de disponibilidade que não pode ser monitorada em tempo real, você encontrará seu projeto semelhante auto-realizado repetidas vezes com semelhanças assustadoras. Atenha-se a algo que faça sentido e que possa ser facilmente monitorado.
As pessoas subestimam as complexidades do sistema sempre disponível.
Para abordar o elefante na sala, deixe-me dizer o seguinte: "Nenhum sistema multi-computador está 100% disponível, poderá no futuro, mas não com a tecnologia atual". Aqui, pela tecnologia atual, estou me referindo à nossa incapacidade de enviar sinais mais rapidamente do que a velocidade da luz e coisas assim. Todos os engenheiros da comp-sci valem a pena conhecer as limitações da computação distribuída , e a maioria deles não menciona isso nas reuniões, com medo de parecer noobs. Para compensar todos aqueles que não mencionam as limitações da computação distribuída , direi que é complicado, mas nem sempre confia nos computadores .
As pessoas superestimam as capacidades de seus engenheiros
Infelizmente, a disponibilidade cai na categoria em que você não sabe o que deseja, mas sabe o que não quer. É um pouco mais complicado que a categoria 'conheça os desejos', como a interface do usuário. Requer um pouco de experiência e muita leitura para aprender com a experiência dos outros e um pouco mais.
Construindo um sistema disponível desde o início
Certifique-se de evangelizar para todas as equipes de arquitetura e design a prioridade correta da disponibilidade como um requisito do sistema.
Atributos do sistema que ajudam a disponibilidade
As seguintes características do sistema demonstraram ter contribuído para a disponibilidade do sistema:
Redundância
Alguns exemplos disso são: nunca ter apenas uma única VM atrás de um VIP ou nunca armazenar apenas uma única cópia dos seus dados. Essas são as perguntas que um bom IAAS facilitará para você resolver, mas você ainda precisará tomar essas decisões.
Modularidade
Um REST modular é melhor que o SOA monolítico. Na verdade, um microsserviço modular está realmente mais disponível do que o habitual HATEOS REST . O raciocínio pode ser encontrado na discussão relacionada ao rendimento na próxima seção. Se você estiver processando em lote, é melhor processá-lo em lotes razoáveis de 10s em comparação a lidar com um lote de 1.000.000.
Resiliência
"I am always angry"
- Hulk
Um sistema resiliente está sempre pronto para se recuperar. Essa resiliência se aplica a instâncias como reconhecer o ACK para gravação somente após a gravação no disco RAID e, possivelmente, em pelo menos dois data centers. Outra tendência mais recente é usar estruturas de dados sem conflito , onde a estrutura de dados assume a responsabilidade de resolver conflitos quando apresentada com duas versões diferentes. Um sistema não pode ser resiliente como uma reflexão tardia, ele deve ser previsto e incorporado. Uma falha é garantida a longo prazo, por isso devemos estar sempre preparados com um plano de recuperação.
Trilha de registro
Tecnicamente, esse é um subtipo de resiliência, mas muito especial por causa de sua capacidade de capturar todos os recursos. Apesar do melhor esforço, podemos não ser capazes de prever o padrão de indisponibilidade. Se possível, mantenha trilha de log suficiente das atividades do sistema para poder reproduzir eventos do sistema. Isso, a um grande custo manual, permitirá que você se recupere de situações imprevistas.
Atributos de disponibilidade
A lista não exaustiva de atributos de 'disponibilidade': Para discussão, vamos supor que a pergunta do usuário seja: "Quantos itens eu tenho no meu carrinho de compras?"
Correção
Você deve produzir a resposta mais precisa possível ou pode cometer erros? Apenas para uma referência, quando você retira dinheiro do caixa eletrônico, não é garantido que ele esteja correto. Se o banco descobrir que cometeu um erro, você poderá reverter as transações. Se o seu sistema está produzindo números primos, então eu acho que você pode querer respostas corretas o tempo todo.
Produção
Pule este ponto, se você respondeu sempre correto para a pergunta do tópico anterior. Às vezes, a resposta às perguntas não precisa ser precisa, por exemplo, quantos amigos eu tenho no Facebook agora? Mas a resposta deve estar no estádio +/- 1 o tempo todo. Quando você está produzindo o resultado esperado, seu rendimento é 100.
Consistência
Sua resposta pode estar correta em um ponto no tempo, mas quando a luz sair da tela e entrar na retina do observador, as coisas poderão ter mudado. Faz sua resposta errada? Não, apenas torna inconsistente. A maioria dos aplicativos é eventualmente consistente, mas o truque é definir que tipo de modelo de consistência seu aplicativo fornecerá. Por acaso seu aplicativo pode ser executado em um único computador, você pode pular essa adorável leitura no teorema do CAP .
Custo
Depende muito do impacto total dos efeitos de curto prazo (perda de receita) e efeitos de longo prazo (má reputação, retenção de clientes). Dependendo do tipo de cliente (pago / gratuito, repetido / exclusivo, cativo) e da disponibilidade de recursos, diferentes níveis de garantias de disponibilidade devem ser incorporados.
Para melhorar a disponibilidade de um sistema existente
O gerenciamento operacional de máquinas individuais e uma rede é tão complexo que suponho que você o tenha deixado para o provedor de nuvem ou você já é especialista o suficiente para saber o que está fazendo. Vou tocar em outros tópicos sob disponibilidade. Para a estratégia de longo prazo, Definir-Medir-Analisar-Controle é uma combinação divina, algo que eu já me vi.
- Defina o que é 'disponibilidade' para seus stakeholders
- Como você medirá o que você definiu
- Análise de causa raiz para identificar gargalos
- Tarefas para melhorias
- Monitoramento contínuo ( controle ) do sistema
Causas de indisponibilidade
Como concordamos que o gerenciamento operacional que abrangeria qualquer gerenciamento de infraestrutura física deveria ser feito por profissionais, abordarei outras causas de indisponibilidade por questões de integridade. A disponibilidade da IMO também deve incluir a falta de comportamento esperado, ou seja, se o usuário não receber a experiência esperada, algo estará indisponível. Com essa definição ampla em mente, o seguinte pode causar indisponibilidade: - Bugs de código - Incidências de segurança - Problemas de desempenho