Escalar contêineres é mais do que simplesmente colocar um proxy na frente de um serviço e ir embora. A escala envolve mais do que apenas distribuição e, no mundo acelerado dos contêineres, há cinco recursos distintos necessários para garantir a escala: novas tentativas , disjuntores, descoberta , distribuição e monitoramento .
Neste segundo post sobre a arte de dimensionar contêineres, vamos nos aprofundar nos disjuntores.
Thomas Edison, que inventou milhares de dispositivos que não funcionavam e alguns famosos que funcionavam, nos deu o conceito de disjuntor em um pedido de patente em 1879. Sim, patentes já existiam naquela época. Enquanto a versão de Edison usava fusíveis, que devem ser substituídos (alguns de nós devem se lembrar de procurá-los freneticamente em nossos carros antigos), versões mais modernas são construídas para "disparar" e interromper o fluxo de eletricidade. Eles podem então ser redefinidos, restaurando o fluxo e a operação normais.
No contexto de escala, os disjuntores operam no mesmo princípio. Eles detectam um “estouro” e o cortam deliberadamente para evitar sobrecarregar os serviços na outra ponta da conexão. Eles também podem ser redefinidos, restaurando posteriormente o fluxo normal de solicitações e respostas.
Os disjuntores fazem parte dos proxies de balanceamento de carga há algum tempo. A premissa é que se – depois de X tentativas – você ainda não conseguir acessar um determinado serviço, ele está fora de serviço. Há motivos para continuar pedindo algo que ele não pode lhe dar, e fazer isso é apenas desperdiçar recursos no proxy e na rede. Então, após um número (normalmente) configurável de falhas, um proxy irá “quebrar” o circuito e se recusar a tentar novas conexões.
Isso não é o mesmo que uma nova tentativa, embora o processo pareça semelhante. As novas tentativas operam sob a premissa de que a solicitação acabará sendo bem-sucedida. Um disjuntor opera sob a premissa de que a solicitação falhará e, portanto, deve-se evitar desperdício de tempo e recursos ao fazer isso.
Uma vez resolvido o problema, o disjuntor pode ser “reiniciado” e o fluxo normal pode ser retomado.
No início, esse processo era manual. Um operador foi obrigado a realizar a reinicialização após garantir que o serviço de destino estava realmente funcionando novamente. Nos últimos anos, esse processo foi automatizado por meio do uso do monitoramento de saúde. Isso normalmente inclui tentativas periódicas de contato com o serviço e, em caso de sucesso, reinicia o disjuntor para permitir operações normais novamente.
Os disjuntores são particularmente importantes em um ambiente de microsserviços em contêineres devido ao alto volume de tráfego fluindo de, para e entre serviços. Embora algumas falhas possam ser reconhecidas rapidamente, outras não serão notadas até um longo tempo limite de TCP devido a problemas na pilha de rede. Os tempos limite geram latência indesejada, portanto, a interrupção do circuito e as novas tentativas devem levar em consideração as tolerâncias gerais do aplicativo (ou intolerância, conforme o caso) para latência. A configuração desses valores precisa levar em consideração os valores de tempo limite e as expectativas da empresa com relação ao desempenho. Baixa tolerância à latência pode exigir menos tentativas e comportamento de interrupção de circuito mais rápido.