Descifrando la Alta Disponibilidad en Microservicios: Explorando Estrategias de Gobernanza de API con Apache APISIX
March 29, 2024
Introducción
La arquitectura de microservicios se ha convertido en la opción principal para la arquitectura de TI en la actualidad. Su flexibilidad y escalabilidad permiten a las empresas adaptarse más fácilmente a los requisitos comerciales en constante cambio. Sin embargo, garantizar la alta disponibilidad de los microservicios se ha convertido en un problema clave en el diseño arquitectónico. En este contexto, las tres estrategias principales en la gobernanza de servicios API —limitación de tasa, corte de circuito y degradación— son particularmente importantes.
Como un componente fundamental en la arquitectura de microservicios, la puerta de enlace API desempeña un papel crucial en la gobernanza de servicios. Apache APISIX, como una puerta de enlace API nativa de la nube de nueva generación, no solo ofrece capacidades de alto rendimiento y seguridad, sino que también proporciona funcionalidades avanzadas de gestión de tráfico. En la siguiente discusión, profundizaremos en el "enfoque triple" de la gobernanza de servicios API y ofreceremos detalles sobre cómo aplicar estas estrategias en APISIX para garantizar la alta disponibilidad de nuestros servicios.
Estrategias de Gobernanza API
Limitación de Tasa
La limitación de tasa, como su nombre indica, es un mecanismo restrictivo aplicado al tráfico. Su principio central es evitar la sobrecarga del sistema o incluso su colapso debido a un tráfico excesivo. El concepto fundamental radica en regular el volumen de solicitudes dentro de intervalos de tiempo específicos, permitiendo solo aquellas solicitudes que cumplen con ciertas restricciones para acceder al sistema, asegurando así el funcionamiento estable de los microservicios y del sistema en general. En escenarios de la vida real, el concepto de limitación de tasa también es evidente. Por ejemplo, durante las horas pico en las estaciones de metro, se configuran múltiples puertas de acceso para controles de seguridad, guiando una cola ordenada y fluida.
La limitación de tasa se puede implementar de varias maneras, incluyendo:
-
Basado en el recuento de solicitudes: Rastrear el número de solicitudes dentro de cada período de tiempo y limitarlas a un umbral específico. Por ejemplo, procesar un máximo de 100 solicitudes por segundo.
-
Basado en la frecuencia de solicitudes: Restringir la frecuencia de solicitudes por cliente o dirección IP para evitar un número excesivo de solicitudes. Por ejemplo, permitir un máximo de 10 solicitudes por minuto.
-
Basado en el recuento de conexiones: Limitar el número de conexiones simultáneas establecidas para evitar consumir recursos excesivos del sistema. Por ejemplo, permitir un máximo de 100 conexiones simultáneas.
Diferentes estrategias de limitación de tasa nos permiten abordar diversos requisitos de escenarios. Por ejemplo, para recursos API valiosos, podemos limitar el número de solicitudes a 10 por minuto. O, para mejorar la disponibilidad del servicio, podemos limitar el número de solicitudes concurrentes para reducir el tiempo de respuesta del servicio, entre otros escenarios. La implementación adecuada de estas estrategias de limitación de tasa puede ayudar a garantizar el funcionamiento normal de los servicios bajo alta concurrencia y picos repentinos de tráfico.
Corte de Circuito
En una arquitectura de microservicios, puede haber situaciones en las que los servicios se llamen entre sí. Si un servicio falla, puede afectar a otros servicios o incluso provocar el colapso de todo el sistema, un fenómeno conocido como "fallo en cascada" o "efecto avalancha". El mecanismo de corte de circuito, como una medida de protección contra fallos en cascada en microservicios, se utiliza para prevenir la propagación de fallos. Cuando un microservicio experimenta anomalías o retrasos, el cortacircuitos se activará rápidamente, bloqueando temporalmente las solicitudes a ese servicio, asegurando así que la estabilidad del sistema no se vea comprometida.
El principio central del mecanismo de corte de circuito radica en el monitoreo en tiempo real del tiempo de respuesta del servicio o las tasas de error. Una vez que estas métricas superan los umbrales preestablecidos, el cortacircuitos se activa automáticamente, deteniendo rápidamente las solicitudes al servicio defectuoso hasta que vuelva a funcionar normalmente. Después de que el servicio se estabiliza, el cortacircuitos se cierra automáticamente, reanudando el acceso al servicio. Este mecanismo es similar a una resistencia en un circuito eléctrico. Cuando el voltaje excede su rango de tolerancia, la resistencia desconecta automáticamente el circuito para evitar que una corriente excesiva dañe otros componentes electrónicos. Después de inspeccionar y reparar el circuito, la resistencia se cierra nuevamente y el circuito reanuda su funcionamiento normal.
Al introducir mecanismos de corte de circuito, la arquitectura de microservicios puede manejar mejor los posibles problemas de fallos en cascada derivados de las llamadas mutuas entre servicios, asegurando la estabilidad y confiabilidad del sistema, especialmente en escenarios de alta presión.
Degradación
La degradación, como una estrategia efectiva para abordar cargas elevadas del sistema, implica deshabilitar temporalmente algunas funciones no críticas o reducir moderadamente la calidad de ciertos servicios para garantizar el funcionamiento estable del sistema en general. En la arquitectura de microservicios, la aplicación de mecanismos de degradación puede proteger inteligentemente algunas funciones no esenciales o temporalmente prescindibles, asegurando así el funcionamiento continuo y estable de las funciones principales. Por ejemplo, en una aplicación de videoconferencia, cuando el ancho de banda de la red es limitado, podemos reducir la calidad de la transmisión de video o deshabilitar temporalmente la funcionalidad de video para garantizar llamadas de audio claras y estables, satisfaciendo así las necesidades básicas de comunicación de la reunión.
Las estrategias comunes incluyen:
-
Degradación de funciones: Cerrar o restringir temporalmente el acceso a ciertas funciones para garantizar el funcionamiento normal de los servicios principales. Por ejemplo, una aplicación de redes sociales puede deshabilitar temporalmente las funciones de "me gusta" o "comentar" durante las horas pico para asegurar que los usuarios puedan navegar por el contenido normalmente.
-
Degradación de calidad: Durante cargas elevadas del sistema, reducir los requisitos de calidad de ciertos servicios o funciones. Por ejemplo, como se mencionó anteriormente, reducir la claridad del video o la tasa de cuadros para garantizar una comunicación fluida.
Limitación de Tasa, Corte de Circuito y Degradación en APISIX
¿Cómo podemos utilizar las tres estrategias principales mencionadas habilitadas en APISIX para mejorar la alta disponibilidad de los microservicios? A continuación, se presentan algunos ejemplos comunes de aplicación para ilustrar.
Limitación de Tasa con el Plugin limit-count
APISIX proporciona varios complementos de gestión de tráfico integrados, como limit-count
, limit-req
y limit-conn
. Dependiendo de las necesidades reales, podemos elegir el método adecuado para el control de tráfico. Tomando el plugin limit-count
como ejemplo, este limita el número total de solicitudes dentro de un intervalo de tiempo específico y devuelve el recuento restante de solicitudes en el encabezado HTTP.
curl -i http://127.0.0.1:9080/apisix/admin/routes/1 \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"uri": "/get",
"plugins": {
"limit-count": {
"count": 3,
"time_window": 60,
"rejected_code": 429,
"key_type": "var",
"key": "remote_addr"
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1
}
}
}'
Corte de Circuito con el Plugin api-breaker
El plugin api-breaker
en APISIX activa automáticamente mecanismos de corte de circuito basados en umbrales preestablecidos para prevenir fallos en cascada. Por ejemplo, puede iniciar el corte de circuito cuando los servicios ascendentes devuelven 3 códigos de estado 500 o 503 consecutivos y reanudar el acceso cuando se recibe un código de estado 200.
curl "http://127.0.0.1:9180/apisix/admin/routes/1" \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"plugins": {
"api-breaker": {
"break_response_code": 502,
"unhealthy": {
"http_statuses": [500, 503],
"failures": 3
},
"healthy": {
"http_statuses": [200],
"successes": 1
}
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1
}
},
"uri": "/get",
}'
Degradación con el Plugin fault-injection
Los plugins fault-injection
y mocking
de APISIX admiten la configuración de estrategias de degradación para deshabilitar temporalmente ciertas funciones o devolver directamente datos preestablecidos durante cargas elevadas del sistema, asegurando la estabilidad del sistema. Por ejemplo, el plugin fault-injection
puede devolver directamente códigos de estado HTTP y valores de cuerpo especificados a los clientes.
curl http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"plugins": {
"fault-injection": {
"abort": {
"http_status": 200,
"body": "Fault Injection!"
}
}
},
"upstream": {
"nodes": {
"httpbin.org:80": 1
},
"type": "roundrobin"
},
"uri": "/get"
}'
Conclusión
La limitación de tasa, el corte de circuito y la degradación, como medidas cruciales de gobernanza de servicios en la arquitectura de microservicios, desempeñan un papel insustituible en la mejora de la alta disponibilidad de los microservicios. Actúan como escudos sólidos, defendiendo la arquitectura de microservicios contra diversos riesgos y desafíos potenciales. Frente a diversos escenarios comerciales, debemos aplicar estas medidas de manera flexible y cautelosa para garantizar que la estabilidad y confiabilidad de la arquitectura de microservicios estén óptimamente protegidas.