Yandex ha publicado el código fuente del marco Userver, que permite crear aplicaciones C++ altamente cargadas que funcionan en modo asíncrono. El marco ha sido probado en cargas de nivel de Yandex y se usa en servicios como Yandex Go, Lavka, Delivery, Market y proyectos fintech.
Userver es el más adecuado para desarrollar aplicaciones con una arquitectura de microservicio. Inicialmente, el marco se desarrolló para Yandex Taxi, con su ayuda, el equipo cambió de una aplicación monolítica a una arquitectura que le permite desarrollar componentes independientes separados (microservicios) y usarlos en diferentes aplicaciones.
Hoy anunciamos el lanzamiento del marco de usuario de código abierto para crear aplicaciones de alta carga. Para nosotros, esta es una forma importante de compartir la experiencia en el desarrollo de microservicios que hemos acumulado. Aquí hay un enlace a un repositorio de GitHub con código fuente, documentación, ejemplos, una plantilla para crear sus propios servicios (con CI configurado, entorno de compilación y prueba) y un servicio de configuración dinámica. Todo esto está publicado bajo la licencia Apache 2.0.
Los microservicios son autónomos, por lo que una aplicación basada en una arquitectura de este tipo es fácil de actualizar y agregarle nuevas funciones. Por lo tanto, el microservicio para encontrar un conductor para pedidos en Taxi se puede usar para una tarea similar, por ejemplo, encontrar un servicio de mensajería para cumplir con los pedidos de Yandex Delivery. Lo mismo se puede hacer con el cálculo de la hora de llegada del conductor o mensajero y muchas otras tareas.
El marco se creó originalmente con énfasis en la confiabilidad y la conveniencia, y en su interior proporciona todo lo que necesita para el desarrollo, diagnóstico, monitoreo, depuración y experimentación. Por ejemplo, userver sugiere cómo corregir errores en la etapa de compilación, sabe cómo trabajar con diferentes bases de datos, cambiar parámetros sobre la marcha, etc.
En cuanto a la composición se menciona que se incluyen los controladores para el trabajo asincrónico con DBMS (MongoDB, PostgreSQL, Redis, ClickHouse, MySQL), clientes y servidores que funcionan asincrónicamente para varios protocolos (HTTP, HTTPS, GRPC, TCP, UDP, TLS), primitivas de bajo nivel para administrar la sincronización y acceso a las capacidades del sistema operativo, así como a componentes de alto nivel para trabajar con caché, tareas, bloqueos distribuidos, rastreo, métricas, estadísticas y datos en formatos JSON/YAML/BSON, ademas de que admite cambiar la configuración del servicio sobre la marcha, sin detenerlo.
En cuanto a las desventajas de la arquitectura monolítica se mencionan los siguientes:
- Consolidación de todo el código dentro de un monolito. Con una gran base de código, la creación y las pruebas pueden llevar horas, y la implementación puede llevar un día entero.
- Interacción cercana de diferentes partes del código. Debe dedicar mucho esfuerzo a las revisiones de código para que las interfaces de las diferentes partes del monolito no se conviertan en un desastre.
- Fragilidad. Un cambio en un módulo puede romper otro módulo.
- Áreas de responsabilidad borrosas. Durante el proceso de desarrollo, muchas partes del código se generalizan, comienzan a ser utilizadas por diferentes equipos, y esto es bueno. Pero como resultado, no está claro quién es el responsable del módulo resultante: los primeros autores; aquellos que hicieron la mayor cantidad de ediciones; o aquellos que usan más activamente el módulo en el código.
Anteriormente, Yandex transfirió sus otras tecnologías clave a la forma de proyectos abiertos, por ejemplo, el sistema de gestión de bases de datos distribuidas YDB, capaz de procesar millones de solicitudes por segundo, así como la biblioteca de aprendizaje automático CatBoost, que Yandex utiliza en la Búsqueda y otros servicios.
Finalmente para quienes estén interesados en poder conocer más al respecto, deben saber que actualmente el soporte para Userver es para Ubuntu, Debian, Fedora, Arch, Gentoo, sistemas macOS, x86, x86_64, AArch64, arquitecturas Arm, compiladores GCC 8+ y Clang 9+, estándares C++17, C++20, C++23.
El código Userver está escrito en C++ y está abierto bajo la licencia Apache 2.0 y se puede consultar desde el siguiente enlace.