BLOG

El arte de escalar contenedores: Disyuntores

Miniatura de Lori MacVittie
Lori MacVittie
Publicado el 18 de enero de 2018

Escalar contenedores es más que simplemente colocar un proxy frente a un servicio y marcharse. Escalar implica mucho más que simplemente distribuir, y en el acelerado mundo de los contenedores hay cinco capacidades distintas necesarias para garantizar la escala: reintentos , disyuntores, descubrimiento , distribución y monitoreo .

En esta segunda publicación sobre el arte de escalar contenedores, profundizaremos en los disyuntores.

Disyuntores

Thomas Edison, quien inventó miles de aparatos que no funcionaban y algunos famosos que sí funcionaban, nos dio el concepto de disyuntor en una aplicação de patente de 1879. Sí, las patentes ya existían en aquel entonces. Si bien la versión de Edison utilizaba fusibles que debían reemplazarse (algunos de nosotros quizás recordemos haberlos buscado frenéticamente en nuestros viejos autos), las versiones más modernas están diseñadas para “dispararse” y detener el flujo de electricidad. Luego se pueden reiniciar, restableciendo el flujo y el funcionamiento normales.

En el contexto de la escala, los disyuntores funcionan según el mismo principio. Detectan un “desbordamiento” y lo cortan deliberadamente para evitar saturar los servicios en el otro extremo de la conexión. También se pueden restablecer, restableciendo posteriormente el flujo normal de solicitudes y respuestas.

Los disyuntores han sido parte de los servidores proxy de equilibrio de carga durante bastante tiempo. La premisa ha sido que si después de X intentos todavía no se puede acceder a un servicio determinado, éste queda fuera de servicio. Hay motivos para seguir pidiéndole algo que no puede proporcionarle, y hacerlo solo supone desperdiciar recursos en el proxy y en la red. Entonces, después de un número (normalmente) configurable de fallas, un proxy “romperá” el circuito y se negará a intentar más conexiones.

Esto no es lo mismo que un reintento, aunque el proceso parece similar. Los reintentos funcionan bajo la premisa de que la solicitud eventualmente tendrá éxito. Un disyuntor funciona bajo la premisa de que la solicitud fallará, por lo que se debe evitar perder tiempo y recursos al hacerlo.

Una vez resuelto el problema, se puede “reiniciar” el disyuntor y reanudarse el flujo normal.

En los primeros tiempos, este proceso era manual. Fue necesario que un operador realizara el reinicio después de asegurarse de que el servicio de destino efectivamente estaba nuevamente en servicio. En los últimos años, este proceso se ha automatizado mediante el uso de la monitorización de la salud. Esto generalmente incluye intentos periódicos de acceder al servicio y, en caso de éxito, reinicia el disyuntor para permitir nuevamente las operaciones normales.

Los disyuntores son particularmente importantes en un entorno de microservicios en contenedores debido al gran volumen de tráfico que fluye hacia, desde y entre los servicios. Si bien algunas fallas pueden reconocerse rápidamente, otras no se notarán hasta que transcurra un largo tiempo de espera de TCP debido a problemas en la pila de red. Los tiempos de espera generan una latencia no deseada, por lo que la interrupción del circuito y los reintentos deben tener en cuenta las tolerancias generales de la aplicação (o la intolerancia, según sea el caso) para la latencia. La configuración de dichos valores debe tener en cuenta los valores de tiempo de espera y las expectativas de la empresa con respecto al rendimiento. Una baja tolerancia a la latencia puede requerir menos reintentos y un comportamiento de interrupción del circuito más rápido.