"Durante la cuarentena, la carga aumentó 5 veces, pero estábamos listos". Cómo Lingualeo pasó a PostgreSQL con 23 millones de usuarios

imagen



El proyecto Lingualeo ya tiene 10 años. Más de 23 millones de personas de Rusia, Turquía, España y América Latina están aprendiendo inglés utilizando nuestro servicio.



LinguaLeo se creó a finales de la década de 2000 y principios de la década de 10 y utilizó las tecnologías y métodos más avanzados en ese momento. Pero pasó el tiempo y quedaron muy desactualizados. Así que decidimos que era hora de actualizar el sistema.



Le pedimos a nuestro líder de desarrollo backend, Oleg Pravdin, que hablara sobre cómo él y su equipo, en paralelo con el soporte del producto principal, ensamblaron una nueva estructura de servicio modular basada en PostgreSQL, transfirieron la lógica empresarial a las bases de datos y migraron con millones de usuarios.



Problemas de productos maduros



“Vine a Lingualeo en agosto de 2018 para liderar el desarrollo de backend. En aquel entonces, el respaldo lo hacía un equipo de 8 desarrolladores y 2 administradores, que mantenían un monolito de 1 millón de líneas de código, principalmente en PHP. Se necesitaron 2 meses para implementar incluso una pequeña característica nueva. Y los costos de infraestructura por cada 10,000 usuarios activos excedieron los $ 1,000 por año.



¿Cómo pasó esto? El caso es que a lo largo de 10 años varios equipos de desarrollo han cambiado en el proyecto. Llegaron nuevas personas, como yo, agregaron nuevos módulos y funciones a su manera. Los equipos cambiaron, los recién llegados no siempre entendieron cómo funcionaban las partes antiguas del sistema, como resultado, el código de Lingualeo se convirtió gradualmente en una caja negra: lógica opaca en el backend, un frente sobrecargado, abundancia de muletas, grandes lagunas en la documentación.



En total, teníamos 20 desarrolladores en nuestro personal, pero era imposible desarrollar el producto: si se agregaba algo, surgían problemas inesperados. El equipo tardó 2-3 semanas en arreglar todo. Los desarrolladores mantenían el código desde 2013 y no había recursos para actualizar la funcionalidad.



Estos son los desafíos que enfrentan un gran número de empresas que desarrollan productos de TI maduros escritos en tecnologías de hace una década. Las tendencias cambian, pero debido a la arquitectura antigua, no se pueden utilizar todos los elementos nuevos.



El producto se desarrolla y se llena de funciones, pero no tienen tiempo para documentarlas en detalle. Estos problemas se resuelven de diferentes formas, pero decidimos esto: necesitas construir un nuevo sistema desde cero y mantener la máxima lógica de producto para que la experiencia del usuario en Lingualeo no cambie.



Paso 1. Ensamblado de un prototipo de la nueva arquitectura



Tuvimos que descubrir cómo actualizar el componente técnico del servicio y reconstruir Lingualeo utilizando tecnologías modernas. Sugerí que la administración cambiara por completo la filosofía del backend: transferir la lógica empresarial a la base de datos y reemplazar la base de datos MySQL con PostgreSQL.



Comencé con un prototipo en papel: dibujé una nueva arquitectura, expliqué cómo podría aumentar el rendimiento y cuántos recursos se necesitarían para prepararlo. Fue difícil proteger el proyecto, porque no había casos de éxito inequívocos a la mano: nadie escribe sobre cómo migrar un servicio con 20 millones de usuarios sin detener el negocio. Pero Lingualeo decidió correr el riesgo y aprobó el plan de cambio.



Diagrama de arquitectura previa a la migración



imagen



PHP, , MySQL . JSON







imagen



SQL PostgreSQL, JSON. -, , JSON



2.



Cuando compartimos nuestros planes con los desarrolladores, quedó claro que el equipo no estaba listo para los cambios. La mayoría de la gente abandonó la empresa: sólo se quedaron los que llegaron recientemente. Para migrar, decidimos volver a montar el equipo de desarrollo.



Buscábamos ambiciosos y dispuestos a los cambios, profesionales y responsables. Intentamos prestar atención no solo a la calidad del código, sino también a las habilidades sociales. Estábamos reconstruyendo la arquitectura del servicio, por lo que necesitábamos personas que no tuvieran miedo de proyectos complejos y estuvieran preparadas para resolver problemas que no habían enfrentado antes.



Algunas personas fueron encontradas por casualidad, como yo, por ejemplo: conocí al CEO de Lingualeo Vladimir Sirotinsky en el avión. Vladimir conoció al futuro líder de front-end en una consulta con otra startup. Pero reclutamos a la mayoría de los nuevos desarrolladores del mercado. Para cubrir 8 vacantes, estudiamos 1,118 solicitudes y realizamos 124 entrevistas: Un



imagen

embudo de candidatos para nuevas vacantes de desarrollador en Lingualeo.



Paso 3. Simplificación de la estructura organizativa



Contamos con tres áreas de desarrollo: web, backend y aplicaciones móviles, también contamos con un departamento de testers. Encontrar a alguien que comprenda todas las industrias a la vez es muy difícil en poco tiempo. Por ello, decidimos abandonar al director técnico y hacer la estructura organizativa del nuevo equipo lo más plana posible. A la empresa solo le queda un nivel de gestión: un líder en cada dirección.



Celebramos reuniones periódicas y nos comunicamos directamente, por lo que el desarrollo se ha vuelto más predecible y se ha reducido el plazo. El CTO puede tomar decisiones irracionales, como la asignación incorrecta de responsabilidades entre equipos. En un sistema donde los clientes potenciales se comunican sin una capa adicional de gerentes, la probabilidad de decisiones irracionales se reduce: siempre podemos discutir cualquier problema en una conversación personal.



Por ejemplo, si entiendo que sería más lógico implementar una función en la nueva estructura de la base de datos, y no en el frente, escribo en el chat y hablo de la idea con el líder del front-end. No es necesario concertar una cita con el CTO ni preparar una presentación para respaldar su idea.



imagen



Estructura organizativa antes y después de los cambios: dejamos caer el CTO en desarrollo y simplificamos la estructura en el departamento de producto. Hoy en día, un diseñador de productos no necesita hablar con dos niveles de gerentes para tener una idea al frente.



Paso 4. Transferir la lógica empresarial a las bases de datos



Anteriormente, la lógica empresarial de Lingualeo estaba al frente y en las aplicaciones. Las funciones del producto fueron manejadas por sistemas que no fueron diseñados para procesar datos, como JavaScript o código PHP. Por lo tanto, hemos adaptado la lógica empresarial de Lingualeo a las bases de datos PostgreSQL.



Selva



Una de las 4 secciones principales del servicio Lingualeo es Jungle . Se trata de un conjunto de materiales en un idioma extranjero (textos, audio y video) en el que puede reconocer la traducción de cualquier palabra. Es decir, los usuarios estudian contenido real en inglés, y si algo no está claro, pueden hacer clic en una palabra del texto o en los subtítulos de un video y ver la traducción.



Texto en la selva



imagen



Video en la selva



imagen



Para que funcione la función de traducción de palabras con un clic, el texto debe estar dividido en palabras, expresiones y frases. Luego, consulte el diccionario y muestre la traducción en una nueva ventana sobre el texto para el usuario. Es bastante difícil dividir el texto para traducir: hay expresiones fijas y phrasal verbs que no tiene sentido dividir en dos palabras. Por ejemplo, quitar y quitar son unidades de contenido diferentes, aunque incluyen la misma palabra.



Toda la lógica de esta función, junto con las excepciones y las complejas reglas de división de texto, se escribió previamente en JavaScript en el frente. La función era muy engorrosa y la traducción podía llevar mucho tiempo.



Hemos implementado esta función en la base de datos. El respaldo envía un JSON listo para usar al frente, en el que el texto ya está dividido en palabras y expresiones. A cada palabra y expresión de la base de datos se le asigna un ID, lo que facilita la búsqueda de una traducción. JSON también tiene en cuenta qué palabras tiene el usuario en el diccionario y cuáles aún no. En el frente, solo queda mostrar información y resaltar palabras con ciertos signos.



Diccionarios



Hicimos lo mismo con la sección de Diccionarios : ahora todo el trabajo se realiza en la base de datos. Tenemos usuarios que tienen más de 100.000 palabras y expresiones en su diccionario. Es necesario proporcionar una búsqueda conveniente en el diccionario, dividir las palabras en grupos y brindar al usuario una amplia gama de filtros.



Anteriormente, la lógica de los diccionarios estaba en el anverso o en la capa PHP, pero ahora el sistema tiene una API completa entre el anverso y el backend. Puede enviar una solicitud con una gran cantidad de parámetros a la base de datos, y de allí saldrá un JSON listo para usar:



imagen



filtros de diccionario: búsqueda por palabras, elección de palabras por tipo de entrenamiento, elección entre palabras y frases, filtrado por palabras aprendidas y nuevas



Cursos



La transferencia de lógica empresarial a la base de datos redujo significativamente la cantidad de código y aceleró el servicio. Por ejemplo, el código de backend de la página Cursos cambió después de la migración. Es visto por usuarios registrados y los cursos son seleccionados por el sistema de acuerdo con diez criterios. Anteriormente, dicha página se formó durante 600 ms y envió 12 solicitudes a la base de datos, ahora solo hay una:



imagen

imagen



Paso 5. Considere los comentarios de los usuarios después del lanzamiento



El desarrollo tardó aproximadamente seis meses: comenzamos a actualizar a fines de 2018 y el lanzamiento se llevó a cabo en mayo de 2019. La mayoría de los usuarios sintieron que el servicio comenzó a funcionar mucho más rápido. Anteriormente, Lingualeo no podía entrenar a más de 2.000 personas simultáneamente sin perder velocidad, pero ahora el sistema puede soportar picos de más de 100.000 usuarios.



Algunas personas también notaron consecuencias negativas. Al migrar con una caja negra, es difícil garantizar la seguridad del cien por ciento de los datos, por lo que algunos han perdido palabras del diccionario, algunos han mostrado incorrectamente el progreso en los cursos.



Poco a poco, mi equipo y yo solucionamos todos los problemas. El resultado principal de los cambios es que ahora no estamos trabajando con una caja negra, sino con un sistema simple y transparente, por lo que fue mucho más fácil resolver los comentarios.



Lingualeo



En abril de 2020, durante el autoaislamiento, la carga de trabajo de Lingualeo fue cinco veces mayor que en el mismo período hace un año. Esto no causó problemas: la velocidad del servicio no disminuyó, los usuarios no notaron nada. Estoy seguro de que si no hubiéramos actualizado el sistema, el servicio simplemente habría fallado.



El producto se ha vuelto no solo más rápido para los usuarios, sino también mucho más fácil de trabajar: ahora es más fácil para el equipo introducir y probar nuevas funciones. Hemos ordenado la documentación y el código se ha vuelto unas 40 veces más pequeño, de modo que los nuevos desarrolladores pueden descubrir fácilmente cómo funciona el servicio.



El producto se ha vuelto más barato, por lo que se necesita alquilar menos potencia informática. El coste por usuario activo en Lingualeo se ha reducido en más de 50 veces, aunque tras las actualizaciones el número de usuarios activos ya se ha duplicado.



Finalmente, el producto es más seguro. Anteriormente, cuando toda la lógica empresarial estaba en la capa PHP, desde allí se enviaban solicitudes a la base de datos desde diferentes funciones. Una base de datos abierta a consultas SQL es un problema: puede realizar una inyección SQL y forzarla a ejecutar código peligroso, como eliminar datos. Ahora, ni una sola consulta SQL viene del exterior, porque trasladamos toda la lógica al interior ".



Queremos seguir publicando blogs regularmente sobre cómo funciona el desarrollo en Lingualeo actualizado. Escriba en los comentarios de qué vale la pena hablar primero: nuestro equipo ha cambiado, la estructura de gestión y la tecnología. Estaremos encantados de responder a todas sus preguntas.



All Articles