Este artículo contiene algunos patrones comunes para ayudar a los ingenieros a trabajar con servicios a gran escala a los que acceden millones de usuarios.
Según la experiencia del autor, esta no es una lista exhaustiva, pero de hecho eficaz consejo. Vamos a empezar.
Las medidas que se enumeran a continuación son relativamente sencillas de implementar pero tienen un gran impacto. Si no los ha probado antes, se sorprenderá de las importantes mejoras.
Infraestructura como código
La primera parte del consejo es implementar la infraestructura como código. Esto significa que debe tener una forma programática de implementar toda la infraestructura. Suena complicado, pero en realidad estamos hablando del siguiente código:
Despliegue de 100 máquinas virtuales
con ubuntu
2 GB de RAM cada uno
tendrán el siguiente código
con estos parametros
Puede realizar un seguimiento de los cambios en su infraestructura y revertirlos rápidamente mediante el control de versiones.
El modernista que hay en mí dice que puedes usar Kubernetes/Docker para hacer todo lo anterior, y tiene razón.
Además, puede proporcionar automatización utilizando Chef, Puppet o Terraform.
Integración y entrega continuas
Para crear un servicio escalable, es importante tener un proceso de compilación y prueba para cada solicitud de extracción. Incluso si la prueba es muy simple, al menos garantizará que el código que implemente se compile.
Cada vez en esta etapa respondes la pregunta: ¿Mi ensamblaje compilará y pasará pruebas? ¿Es válido? Esto puede parecer un listón bajo, pero resuelve muchos problemas.
No hay nada más bonito que ver estas garrapatas
Para esta tecnología puedes evaluar Github, CircleCI o Jenkins.
Equilibradores de carga
Entonces, queremos ejecutar un balanceador de carga para redirigir el tráfico y garantizar la misma carga en todos los nodos o el servicio continúa en caso de falla:
Un equilibrador de carga suele hacer un buen trabajo al distribuir el tráfico. La mejor práctica es sobreequilibrar para no tener un único punto de falla.
Normalmente, los balanceadores de carga se configuran en la nube que utiliza.
RayID, ID de correlación o UUID para solicitudes
¿Alguna vez ha encontrado un error de aplicación con un mensaje como este: "Algo salió mal. Guarde esta identificación y envíela a nuestro equipo de soporte"?
Un identificador único, ID de correlación, RayID o cualquiera de sus variaciones es un identificador único que le permite rastrear una solicitud a lo largo de su ciclo de vida. Esto le permite rastrear toda la ruta de la solicitud en los registros.
El usuario realiza una solicitud al sistema A, luego A contacta a B, quien contacta a C, lo almacena en X y luego la solicitud se devuelve a A.
Si se conectara de forma remota a máquinas virtuales e intentara rastrear la ruta de la solicitud (y correlacionar manualmente qué llamadas se realizan), se volvería loco. Tener un identificador único hace la vida mucho más fácil. Esta es una de las cosas más sencillas que puede hacer para ahorrar tiempo a medida que crece su servicio.
Nivel medio
El asesoramiento aquí es más complejo que los anteriores, pero las herramientas adecuadas facilitan la tarea, proporcionando un retorno de la inversión incluso para las pequeñas y medianas empresas.
Registro centralizado
¡Felicidades! Ha implementado 100 máquinas virtuales. Al día siguiente, el director ejecutivo llega y se queja de un error que recibió mientras probaba el servicio. Informa la identificación correspondiente de la que hablamos anteriormente, pero tendrás que revisar los registros de 100 máquinas para encontrar la que causó el bloqueo. Y hay que encontrarlo antes de la presentación de mañana.
Si bien esto suena como una aventura divertida, es mejor asegurarse de poder buscar todas las revistas en un solo lugar. Resolví el problema de centralizar registros utilizando la funcionalidad incorporada de la pila ELK: admite la recopilación de registros con capacidad de búsqueda. Esto realmente ayudará a resolver el problema de encontrar una revista específica. Como beneficio adicional, puedes crear gráficos y otras cosas divertidas como esas.
Funcionalidad de pila ELK
Agentes de seguimiento
Ahora que su servicio está en funcionamiento, debe asegurarse de que funcione sin problemas. La mejor manera de hacer esto es ejecutar varios agentes, que trabajan en paralelo y comprueban que funciona y se realizan las operaciones básicas.
En este punto compruebas que la versión en ejecución se siente bien y funciona bien.
Para proyectos pequeños y medianos, recomiendo Postman para monitorear y documentar las API. Pero, en general, solo desea asegurarse de tener una manera de saber cuándo se produjo una interrupción y recibir una notificación oportuna.
Autoescalado dependiendo de la carga
Es muy sencillo. Si tiene solicitudes de servicio de VM y se acerca al 80 % de uso de memoria, puede aumentar sus recursos o agregar más VM al clúster. La ejecución automática de estas operaciones es excelente para cambios de potencia elástica bajo carga. Pero siempre debes tener cuidado con cuánto dinero gastas y establecer límites razonables.
Con la mayoría de los servicios en la nube, puede configurarlos para que se escalen automáticamente utilizando más servidores o servidores más potentes.
Sistema de experimentos
Una buena forma de implementar actualizaciones de forma segura es poder probar algo para el 1% de los usuarios durante una hora. Por supuesto, usted ha visto esos mecanismos en acción. Por ejemplo, Facebook muestra a partes de la audiencia un color diferente o cambia el tamaño de fuente para ver cómo los usuarios perciben los cambios. Esto se llama prueba A/B.
Incluso la publicación de una nueva función se puede iniciar como un experimento y luego determinar cómo publicarla. También tiene la posibilidad de "recordar" o cambiar la configuración sobre la marcha según la función que está causando la degradación de su servicio.
nivel avanzado
A continuación se ofrecen consejos que son bastante difíciles de implementar. Probablemente necesitarás un poco más de recursos, por lo que a una pequeña o mediana empresa le resultará difícil gestionar esto.
Implementaciones azul-verde
Esto es lo que yo llamo la forma de desarrollo "Erlang". Erlang se volvió ampliamente utilizado cuando aparecieron las compañías telefónicas. Se empezaron a utilizar softswitches para enrutar llamadas telefónicas. El objetivo principal del software de estos conmutadores era no perder llamadas durante las actualizaciones del sistema. Erlang tiene una buena manera de cargar un nuevo módulo sin bloquear el anterior.
Este paso depende de la presencia de un equilibrador de carga. Imaginemos que tiene la versión N de su software y luego desea implementar la versión N+1.
Usted podría simplemente detenga el servicio e implemente la siguiente versión en un momento que funcione para sus usuarios y obtenga un tiempo de inactividad. Pero supongamos que tienes realmente estrictas condiciones SLA. Entonces, SLA 99,99% significa que puedes desconectarte sólo en 52 minutos por año.
Si realmente desea lograr tales indicadores, necesitará dos implementaciones al mismo tiempo:
el que está ahora mismo (N);
próxima versión (N+1).
Le indica al equilibrador de carga que redirija un porcentaje del tráfico a la nueva versión (N+1) mientras supervisa activamente las regresiones.
Aquí tenemos una implementación N verde que funciona bien. Estamos intentando pasar a la siguiente versión de esta implementación.
Primero enviamos una prueba realmente pequeña para ver si nuestra implementación N+1 funciona con una pequeña cantidad de tráfico:
Finalmente, tenemos un conjunto de comprobaciones automatizadas que eventualmente ejecutamos hasta que se completa nuestra implementación. Si usted muy muy Tenga cuidado, también puede guardar su implementación N para siempre para una reversión rápida en caso de una regresión incorrecta:
Si desea pasar a un nivel aún más avanzado, deje que todo en la implementación azul-verde se ejecute automáticamente.
Detección de anomalías y mitigación automática
Dado que tiene un registro centralizado y una buena recopilación de registros, ya puede establecer objetivos más altos. Por ejemplo, predecir fallas de manera proactiva. Las funciones se rastrean en monitores y registros y se crean varios diagramas, y usted puede predecir de antemano qué saldrá mal:
Una vez que se detectan anomalías, se comienza a examinar algunas de las pistas que proporciona el servicio. Por ejemplo, un aumento en la carga de la CPU puede indicar que un disco duro está fallando, mientras que un aumento en las solicitudes puede indicar que es necesario ampliar la escala. Este tipo de datos estadísticos le permite hacer que el servicio sea proactivo.
Con estos conocimientos, puede escalar en cualquier dimensión y cambiar de forma proactiva y reactiva las características de las máquinas, bases de datos, conexiones y otros recursos.
Eso es todo
Esta lista de prioridades te ahorrará muchos problemas si estás planteando un servicio en la nube.
El autor del artículo original invita a los lectores a dejar sus comentarios y realizar cambios. El artículo se distribuye como código abierto, solicitudes de extracción del autor. acepta en Github.