Qual deve ser o escopo de uma verificação de integridade de um sistema que implanta um aplicativo da web?

13

Hoje, tive a tarefa de "escrever uma verificação de integridade" para um serviço de longa duração que é um sistema de orquestração para implantar um aplicativo da web.

Estou tentando determinar qual seria o escopo de uma verificação de saúde e fiz estas perguntas relacionadas ao escopo da verificação de saúde:

  1. É bom considerar o serviço íntegro se o sistema de orquestração relatar que a tarefa está em execução?
  2. Ou devemos executar ping manualmente em cada serviço?
  3. Ou deveria ir além e tentar garantir que o aplicativo Web faça o que deveria fazer, como mostrar uma página da Web?
  4. A verificação de integridade também precisa verificar se alguns serviços dependentes também estão em execução? Como um banco de dados ou o próprio sistema de orquestração. Ou isso é responsabilidade de outro exame de saúde?
  5. E, finalmente, se um dos serviços dependentes estiver morto e o aplicativo Web falhar posteriormente, o aplicativo Web deve relatar um problema de saúde ou é bom, porque não é culpa dos aplicativos da Web?

Eu sei que essas são cinco perguntas separadas, mas todas elas se relacionam ao escopo de uma verificação de integridade para um serviço de longa duração que implanta um aplicativo Web, então pensei que faria mais sentido mantê-los agrupados em uma única pergunta.

Isso é difícil de implementar para mim, porque não tenho certeza da definição do que é saudável ou de como deve ser uma verificação de integridade padrão para algo assim.

O que deve conter uma verificação de integridade para este serviço específico?

Phil Winder
fonte
2
Nunca confie em relatórios de status automatizados. Sempre verifique o status você mesmo. Curiosidades: Uma das causas do incidente em Tree Mile Island foi um indicador de "válvula fechada" que na verdade indicava apenas que o comando "fechar válvula" foi emitido , e não que a válvula estava realmente fechada .
precisa
@KilianFoth: em uma nota semelhante: conheço uma empresa que testou religiosamente e minuciosamente que seus backups funcionavam. Então, um dia, eles tiveram uma falha catastrófica no disco e descobriram: a restauração não ocorreu.
Jörg W Mittag 14/03
7
Eu acho que é o trabalho da pessoa que pediu para você "fazer uma verificação de saúde" para definir o que eles querem dizer com "saúde". Caso contrário, é apenas adivinhação.
Jörg W Mittag 14/03
1
Concordo com o comentário do @ JörgWMittag, mas eu daria um passo adiante. Você deve obter seus requisitos não apenas da pessoa que lhe disse que precisa criar uma "verificação de saúde", mas também descobrir quem são as pessoas ou os sistemas que usam os dados que fazem parte de uma verificação de saúde e descobrir o que eles precisa ou como eles precisam. Estes são os seus requisitos que orientarão seu projeto.
Thomas Owens
1
Esclarei isso um pouco e votei para reabrir, pois acho que a questão principal está no tópico. Entender como identificar o que deve ser incluído em uma verificação de saúde é algo perfeitamente normal para o design de software, mesmo que a resposta real seja "solicite requisitos" (ou uma variação disso).
Enderland

Respostas:

15

Isso é difícil de implementar devido à definição do que é saudável

Você respondeu sua própria pergunta aqui. A definição de uma verificação de saúde vai variar, porque o que é saudável varia. Também depende do que está emitindo a verificação de saúde.

Uma boa pergunta é: "do ponto de vista do solicitante, o serviço verificado está funcionando como esperado?" Se este é você, você pode defini-lo. Se for outra equipe / serviço, você precisará identificar qual é o padrão / especificação para verificações de saúde.

Provavelmente em uma organização grande, você terá algum tipo de padrão para o que uma verificação de saúde deve fazer. Resolver aquilo.

Especificamente aqui, seu exemplo de aplicativo da web significa que ele não deve retornar íntegro porque o aplicativo da web não está íntegro. Mas talvez sua definição de "saudável" inclua isso como "ok". Isso faz parte da discussão de requisitos acima (novamente, mesmo que seja apenas seu próprio código).

Minha recomendação, supondo que não seja especificado em outro lugar, seria ter algum tipo de código de status associado a diferentes falhas. Quando você consulta o aplicativo da web, ele pode retornar um erro que diz "o serviço dependente está inoperante" e assim seu cliente (ou o que estiver executando a verificação de integridade) pode saber o motivo pelo o cliente está inoperante.

Para as perguntas editadas:

É bom considerar o serviço íntegro se o sistema de orquestração relatar que a tarefa está em execução?

Não, apenas porque um processo está em execução não significa que ele não esteja travado, totalmente não funcional ou com uma grande variedade de outras possibilidades.

Ou devemos executar ping manualmente em cada serviço?

Isso pode funcionar, dependendo do escopo da funcionalidade do seu aplicativo. Se a verificação do serviço responder a um "você está vivo?" ping, isso pode ser tudo o que é necessário. Mas se o serviço puder ser "vivo e responsivo, mas não estiver funcionando", talvez seja necessário verificar outras coisas também.

Ou deveria ir além e tentar garantir que o aplicativo Web faça o que deveria fazer, como mostrar uma página da Web?

Sua verificação de saúde precisa garantir que a funcionalidade necessária esperada funcione conforme o esperado.

Se seu aplicativo retorna "saudável" e não pode fazer o que precisa fazer, assim como você pode se livrar de toda a healthcheck como ele vai te dar falsos positivos (para não mencionar confundir o Parreira fora de pessoas tentando depurar o problema - 'hey nosso servidor da web mostra boa saúde, por que não conseguimos ver a página? ').

A verificação de integridade também precisa verificar se alguns serviços dependentes também estão em execução? Como um banco de dados ou o próprio sistema de orquestração. Ou isso é responsabilidade de outro exame de saúde?

Isso depende um pouco. Se o seu serviço depende de outro serviço, a natureza dessa interação deve ser refletida nas chamadas de API / rede enviadas a ele no seu aplicativo e incorporadas à verificação de saúde.

Por exemplo, um servidor da web que lê um banco de dados precisa ter informações de status sobre o banco de dados embutido nele - ou o aplicativo da web simplesmente trava se a chamada da API falhar. Você pode modificar trivialmente essas chamadas para serem incorporadas à sua verificação de saúde.

No entanto, se seu serviço estiver enviando eventos para consumidores que ouvem, sem nenhuma validação, será menos importante para a funcionalidade do seu aplicativo que os consumidores estejam vivos. "Saudável" para o seu aplicativo está enviando as mensagens, na verdade não as recebe.

Basicamente, se o seu serviço precisar conversar com outros serviços e verificar a saúde deles de qualquer maneira, faz sentido ter pelo menos um nível básico de verificação para verificar a integridade do serviço. Isso deve fazer sentido conceitualmente, considerando o que acabei de dizer, pois seu aplicativo já estará lidando com isso (ou travando aleatoriamente, eu acho).

E, finalmente, se um dos serviços dependentes estiver morto e o aplicativo Web falhar posteriormente, o aplicativo Web deve relatar um problema de saúde ou é bom, porque não é culpa dos aplicativos da Web?

Isso é basicamente respondido acima. Minha recomendação seria que sua verificação de saúde retornasse um código / mensagem / o que for que der essas informações. As duas informações são importantes: que o serviço dependente de que seu serviço precisa está morto e que seu serviço não funcionará conforme o esperado.

enderland
fonte
2

Geralmente, um exame de saúde significa apenas "está vivo e está respondendo". As verificações adicionais são altamente especializadas e dependem inteiramente do uso do sistema. Se você faz o possível para verificar se um sistema está processando solicitações corretamente, é com você, mas você deve fazer o básico primeiro - verifique se está lá, verifique se pode receber solicitações e retornará uma resposta.

A maneira mais fácil de implementar uma verificação de saúde é simplesmente escrever um comando que o serviço processa usando o mesmo mecanismo usado por outros comandos, que nada faz além de retornar uma confirmação. Isso mostrará vivacidade e que o sistema está recebendo e processando respostas.

A verificação de sistemas dependentes não faz parte da verificação de integridade. Você precisa mantê-lo simples e independente. Adicione uma verificação de integridade a cada serviço dependente por vez. Dessa forma, você pode obter uma lista de sistemas saudáveis ​​em execução e saber facilmente quando alguém fica mal e qual é!

gbjbaanb
fonte
No sistema que estou escrevendo, basta consultar cada serviço dependente para obter informações de versão. Se responder em tempo hábil (2500ms no meu caso), será considerado "ativo". Eu os consulto todos em paralelo, para que meu pior tempo de resposta seja limitado.
TMN
1

Na minha experiência, serviços críticos tendem a ter os seguintes recursos:

Batimento cardiaco

Se o serviço for executado regularmente, isso apenas grava uma linha em um arquivo de log ou similar, juntamente com um carimbo de data / hora para indicar que o corpo do serviço entrou em ação em um determinado momento.

Migalhas de pão

De maneira semelhante ao acima, as trilhas de navegação geralmente são apenas um despejo do nome do método (e ocasionalmente dos parâmetros) para mostrar que o serviço está processando o corpo do serviço conforme o esperado e o paradeiro do fluxo. Como eles podem gerar mais saída, geralmente são controlados por arquivos de configuração ou similares, para que possam ser desativados assim que o serviço for instalado.


Pode ser tentador adicionar muitas outras coisas, como o estado de vários servidores, serviços e bancos de dados, etc. Embora isso seja sem dúvida valioso, eu aconselho a não escrever nada muito extenso. Isso pode ser útil para sua própria paz de espírito, mas essas salvaguardas tendem a ser abusadas quando as partes encarregadas dos vários pontos de contato souberem que estão lá. Antes que você perceba, você pode escrever um aplicativo de diagnóstico para toda a empresa.

Robbie Dee
fonte