En pocas palabras, la idea detrás de los lanzamientos canary es entregar una nueva versión de software solo a una fracción de los usuarios, analizar los resultados y decidir si continuar o no. Si los resultados no están alineados con las expectativas, retroceder; si es así, aumente la cantidad de usuarios expuestos hasta que todos los usuarios se beneficien de la nueva versión.
En esta publicación, me gustaría detallar brevemente esta introducción, explicar diferentes formas de definir la fracción y mostrar cómo ejecutarla con Apache APISIX.
El término "canario" proviene de la industria minera del carbón. Durante la minería, no es raro que se liberen gases tóxicos: en un espacio pequeño y cerrado, puede significar una muerte rápida. Peor aún, el gas puede ser inodoro, por lo que los mineros lo respirarían hasta que fuera demasiado tarde para irse. El monóxido de carbono es bastante común en las minas de carbón y no es detectable por los sentidos humanos.
Por esta razón, los mineros trajeron canarios bajo tierra. Si el canario caía muerto repentinamente, había muchas posibilidades de que se hubiera roto esa bolsa de gas y ya era hora de abandonar el lugar.
Hace años, adoptamos este enfoque para lanzar una nueva versión de software. La analogía es la siguiente: los mineros son el equipo de operaciones que implementa la versión, el canario consta de todas las herramientas para medir el impacto de la liberación y el gas es un error (crítico).
La parte más crucial es que debe medir el impacto del lanzamiento, incluidas las tasas de falla, los códigos de estado HTTP, etc., y compararlos con los de la versión anterior. Está fuera del alcance de esta publicación, pero nuevamente, es fundamental si desea beneficiarse de las versiones canary. La segunda parte más importante es la capacidad de retroceder rápidamente si la nueva versión tiene errores.
Tenga en cuenta que las versiones canary no son la única forma de gestionar el riesgo de publicar código nuevo. Por ejemplo, las marcas de funciones son otra forma popular:
Los indicadores de funciones representan un enfoque más ágil (en el verdadero sentido de la palabra) hacia las reversiones. Si una característica de cada 10 tiene errores, no es necesario cancelar la implementación de la nueva versión; solo desactivas la función de errores. Sin embargo, este superpoder tiene el costo de una complejidad adicional del código base, independientemente de si depende de productos de terceros o lo implementa usted mismo.
Por otro lado, Canary requiere una canalización de implementación madura para poder implementar y cancelar la implementación a voluntad.
La idea detrás de las versiones canary es permitir que solo una fracción de usuarios acceda a la nueva versión. La mayoría de las definiciones canarias sólo definen "fracción" como un porcentaje de usuarios. Sin embargo, hay más.
El primer paso puede ser permitir que solo los usuarios examinados verifiquen que la implementación en el entorno de producción funciona como se esperaba. En este caso, puede reenviar sólo un conjunto específico de usuarios internos, por ejemplo , evaluadores, a la nueva versión. Si conoces a las personas de antemano y el sistema autentica a los usuarios, puedes configurarlo por identidad; de lo contrario, debe recurrir a alguna forma genérica, por ejemplo , encabezados HTTP - X-Canary: Let-Me-Go-To-v2
.
Recuerde que debemos monitorear los sistemas antiguos y nuevos para detectar discrepancias. Si no aparece nada, es un momento excelente para aumentar el grupo de usuarios reenviados a la nueva versión. Supongo que comes tu propia comida para perros, es decir ; Los miembros del equipo utilizan el software que están desarrollando. Si no tiene, por ejemplo, un sitio de comercio electrónico para automóviles de lujo, puede omitir esta sección.
Para aumentar la fracción de usuarios y al mismo tiempo limitar los riesgos, ahora podemos proporcionar indiscriminadamente la nueva versión a los usuarios internos. Podemos configurar el sistema para reenviar a la nueva versión según la IP del cliente para hacer esto. En una época en la que la gente trabajaba en el sitio, era fácil ya que sus IP estaban en un rango específico. El control remoto no cambia mucho ya que los usuarios probablemente accedan a la red de la empresa a través de una VPN.
Nuevamente, supervise y compare en este punto.
En este punto, todo debería funcionar como se espera para los usuarios internos, ya sean algunos o todos. Pero así como ningún plan sobrevive al contacto con el enemigo, ningún uso puede imitar toda la diversidad de una carga de trabajo de producción. En definitiva, debemos dejar que los usuarios habituales accedan a la nueva versión, pero de forma controlada, tal y como hemos ido aumentando progresivamente el número de usuarios hasta ahora: empezar con una pequeña fracción, monitorizarla y, si todo está bien, aumentar la fracción. .
Aquí se explica cómo hacerlo con Apache APISIX. Apache APISIX ofrece una arquitectura basada en complementos y proporciona un complemento que satisface nuestras necesidades, es decir, el complemento traffic-split
.
El complemento
traffic-split
se puede utilizar para dirigir dinámicamente partes del tráfico a varios servicios Upstream.Esto se hace configurando
match
, que son reglas personalizadas para dividir el tráfico, yweighted_upstreams
, que es un conjunto de Upstreams a los que dirigir el tráfico.
Comencemos con algunos upstreams básicos, uno para cada versión:
upstreams: - id: v1 nodes: "v1:8080": 1 - id: v2 nodes: "v2:8080": 1
Podemos usar el complemento traffic-split
para reenviar la mayor parte del tráfico a v1 y una fracción a v2:
routes: - id: 1 uri: "*" #1 upstream_id: v1 plugins: traffic-split: rules: - weighted_upstreams: #2 - upstream_id: v2 #3 weight: 1 #3 - weight: 99 #3
Nuevamente, monitoreamos todo y nos aseguramos de que los resultados sean los esperados. Luego, podemos aumentar la fracción del tráfico reenviado a v2, por ejemplo :
routes: - id: 1 uri: "*" upstream_id: v1 plugins: traffic-split: rules: - weighted_upstreams: - upstream_id: v2 weight: 5 #1 - weight: 95 #1
Tenga en cuenta que Apache APISIX recarga los cambios en el archivo anterior cada segundo. Por lo tanto, divide el tráfico casi en tiempo real. Alternativamente, puede utilizar la API de administración para lograr lo mismo.
En lo anterior, pasé de usuarios internos a una fracción de usuarios externos. Quizás liberar a todos los usuarios internos sea un riesgo demasiado grande en su organización y necesite aún más control. Tenga en cuenta que en este caso puede configurar aún más el complemento traffic-split
.
routes: - id: 1 uri: /* upstream_id: v1 plugins: traffic-split: rules: - match: - vars: [["http_X-Canary","~=","Let-Me-Go-To-v2"]] #1 - weighted_upstreams: - upstream_id: v2 weight: 5 - weight: 95
X-Canary
tiene el valor configurado.
El siguiente comando siempre reenvía a v1:
curl http://localhost:9080
El siguiente comando también reenvía siempre a v1:
curl -H 'X-Canary: Let-Me-Go-To-v1' http://localhost:9080
El siguiente comando divide el tráfico según los pesos configurados, es decir , 95/5:
curl -H 'X-Canary: Let-Me-Go-To-v2' http://localhost:9080
Esta publicación explica las versiones canary y cómo se puede configurar una a través de Apache APISIX. Puede comenzar con varias rutas con diferentes prioridades y pasar al complemento traffic-split
. Este último incluso se puede configurar aún más para permitir casos de uso más complejos.
El código fuente completo de esta publicación se puede encontrar en GitHub .
Para llegar más lejos:
Publicado originalmente en A Java Geek el 3 de diciembre de 2023