"Durante a quarentena, a carga aumentou 5 vezes, mas estávamos prontos." Como o Lingualeo mudou para o PostgreSQL com 23 milhões de usuários

imagem



O projeto Lingualeotem 10 anos. Mais de 23 milhões de pessoas da Rússia, Turquia, Espanha e América Latina estão aprendendo inglês usando nosso serviço.



O LinguaLeo foi criado no final dos anos 2000 e no início dos anos 10 e usava as tecnologias e métodos mais avançados da época. Mas o tempo passou e eles ficaram muito desatualizados. Portanto, decidimos que era hora de atualizar o sistema.



Pedimos ao nosso líder de desenvolvimento de backend, Oleg Pravdin, para falar sobre como ele e sua equipe, em paralelo com o suporte do produto principal, montaram uma nova estrutura modular de serviços baseada em PostgreSQL, transferiram lógica de negócios para bancos de dados e migraram com milhões de usuários.



Problemas de produtos maduros



“Eu vim para o Lingualeo em agosto de 2018 para liderar o desenvolvimento de back-end. Naquela época, o apoio era feito por uma equipe de 8 desenvolvedores e 2 administradores, que mantinham um monólito de 1 milhão de linhas de código, principalmente em PHP. Demorou 2 meses para implementar até mesmo um pequeno recurso novo. E os custos de infraestrutura por 10.000 usuários ativos ultrapassaram US $ 1.000 por ano.



Como isso aconteceu? O fato é que ao longo de 10 anos várias equipes de desenvolvimento mudaram no projeto. Novas pessoas vieram, como eu, adicionaram novos módulos e recursos à sua própria maneira. As equipes mudaram, os novatos nem sempre entendiam como funcionavam as partes antigas do sistema, como resultado, o código do Lingualeo aos poucos se transformou em uma caixa preta: lógica opaca no backend, frente sobrecarregada, abundância de muletas, grandes lacunas na documentação.



No total, tínhamos 20 desenvolvedores em nossa equipe, mas era impossível desenvolver o produto: se algo fosse adicionado, surgiam problemas inesperados. A equipe levou de 2 a 3 semanas para consertar tudo. Os desenvolvedores estavam mantendo o código de 2013, e não havia recursos para atualizar a funcionalidade.



Esses são os desafios enfrentados por um grande número de empresas que desenvolvem produtos de TI maduros escritos em tecnologias de uma década atrás. As tendências mudam, mas devido à arquitetura antiga, nem todos os novos itens podem ser usados.



O produto se desenvolve e fica repleto de funções, mas eles não têm tempo para documentá-las em detalhes. Esses problemas são resolvidos de maneiras diferentes, mas decidimos desta forma: você precisa construir um novo sistema do zero e manter a lógica do produto ao máximo para que a experiência do usuário no Lingualeo não mude.



Etapa 1. Montou um protótipo da nova arquitetura



Tivemos que descobrir como atualizar o componente técnico do serviço e reconstruir o Lingualeo usando tecnologias modernas. Eu sugeri à gerência mudar completamente a filosofia do backend: transferir a lógica de negócios para o banco de dados e substituir o banco de dados MySQL por PostgreSQL.



Comecei com um protótipo no papel: desenhei uma nova arquitetura, expliquei como poderia aumentar o desempenho e quantos recursos seriam necessários para preparar. Foi difícil proteger o projeto, porque não havia histórias de sucesso inequívocas à mão: ninguém escreve sobre como migrar um serviço com 20 milhões de usuários sem parar o negócio. Mas o Lingualeo decidiu correr o risco e aprovou o plano de mudança.



Diagrama da arquitetura de pré-migração



imagem



PHP, , MySQL . JSON







imagem



SQL PostgreSQL, JSON. -, , JSON



2.



Quando compartilhamos nossos planos com os desenvolvedores, ficou claro que a equipe não estava pronta para mudanças. A maior parte das pessoas saiu da empresa: só permaneceram os que chegaram recentemente. Para migrar, decidimos reunir a equipe de desenvolvimento.



Procuramos empresas ambiciosas e prontas para mudanças, profissionais e responsáveis. Procuramos prestar atenção não apenas na qualidade do código, mas também nas habilidades soft. Estávamos reconstruindo a arquitetura do serviço, então precisávamos de pessoas que não tivessem medo de projetos complexos e estivessem prontas para resolver problemas que não haviam enfrentado antes.



Algumas pessoas foram encontradas por acaso, como eu, por exemplo: Conheci o CEO da Lingualeo Vladimir Sirotinsky no avião. Vladimir conheceu o futuro líder front-end em uma consulta com outra startup. Mas recrutamos a maioria dos novos desenvolvedores do mercado. Para preencher 8 vagas, estudamos 1.118 inscrições e conduzimos 124 entrevistas: Um



imagem

funil de candidatos para novas vagas de desenvolvedor no Lingualeo.



Etapa 3. Simplificou a estrutura organizacional



Temos três áreas de desenvolvimento: aplicações web, backend e mobile, contamos também com um departamento de testadores. Encontrar alguém que entenda todos os setores ao mesmo tempo é muito difícil em pouco tempo. Portanto, decidimos abandonar o diretor técnico e tornar a estrutura organizacional da nova equipe o mais plana possível. A empresa tem apenas um nível de gestão restante - um líder em cada direção.



Fazemos reuniões regulares e nos comunicamos diretamente, então o desenvolvimento se tornou mais previsível, o prazo foi reduzido. O CTO pode tomar decisões irracionais, como a atribuição incorreta de responsabilidades entre as equipes. Em um sistema em que os leads se comunicam sem uma camada adicional de gerentes, a probabilidade de decisões irracionais é reduzida: sempre podemos discutir qualquer problema em uma conversa pessoal.



Por exemplo, se eu entender que seria mais lógico implementar uma função na nova estrutura do banco de dados, e não no front, escrevo para o chat e discuto a ideia com o líder do front-end. Não há necessidade de marcar uma reunião com o CTO ou preparar uma apresentação para apoiar sua ideia.



imagem



Estrutura organizacional antes e depois das mudanças: abandonamos o CTO no desenvolvimento e simplificamos a estrutura no departamento de produto. Hoje em dia, um designer de produto não precisa falar com dois níveis de gerentes para levar uma ideia à frente.



Etapa 4. Lógica de negócios transferida para bancos de dados



No passado, a lógica de negócios da Lingualeo estava na frente e nas aplicações. As funções do produto foram resolvidas por sistemas que não foram projetados para processar dados, por exemplo, em JavaScript ou código PHP. Portanto, transportamos a lógica de negócios do Lingualeo para bancos de dados PostgreSQL.



Selva



Uma das 4 seções principais do serviço Lingualeo é o Jungle . Trata-se de um conjunto de materiais em língua estrangeira - textos, áudio e vídeo - em que você pode reconhecer a tradução de qualquer palavra. Ou seja, o usuário estuda conteúdo real em inglês e, se algo não estiver claro, pode clicar na palavra no texto ou na legenda do vídeo e ver a tradução.



Texto na Selva



imagem



Vídeo na Selva



imagem



Para que a função de tradução de palavras com um clique funcione, o texto deve ser dividido em palavras, expressões e frases. Então - consulte o dicionário e exiba a tradução em uma nova janela sobre o texto para o usuário. É bastante difícil dividir o texto para tradução: existem expressões fixas e verbos frasais que não faz sentido dividir em duas palavras. Por exemplo, tirar e tirar são unidades diferentes de conteúdo, embora incluam a mesma palavra.



Toda a lógica para esta função, junto com exceções e regras complexas de divisão de texto, foi previamente escrita em JavaScript na frente. A função era muito complicada e a tradução demorava muito tempo.



Implementamos esse recurso no banco de dados. Backing envia um JSON pronto para a frente, no qual o texto já está dividido em palavras e expressões. Cada palavra e expressão no banco de dados recebe um ID, o que torna mais fácil encontrar uma tradução. Além disso, o JSON leva em consideração quais palavras o usuário possui no dicionário e quais ainda não estão. Na frente, falta mostrar informações e destacar palavras com determinados sinais.



Dicionários



Fizemos o mesmo com a seção Dicionários : todo o trabalho agora acontece no banco de dados. Temos usuários que possuem mais de 100.000 palavras e expressões em seus dicionários. É necessário fornecer uma pesquisa conveniente no dicionário, dividir as palavras em grupos e fornecer ao usuário uma ampla gama de filtros.



Anteriormente, a lógica dos dicionários ficava no lado frontal ou na camada PHP, mas agora o sistema tem uma API completa entre o front e o backend. Você pode enviar uma solicitação com um grande número de parâmetros para o banco de dados, e daí sairá um JSON pronto:



imagem



Filtros de dicionário: pesquisa por palavras, escolha de palavras por tipo de treinamento, escolha entre palavras e frases, filtro por palavras aprendidas e novas



Cursos



A transferência da lógica de negócios para o banco de dados reduziu significativamente a quantidade de código e acelerou o serviço. Por exemplo, o código de back-end da página Cursos mudou após a migração. Ele é visto por usuários registrados e os cursos são selecionados pelo sistema de acordo com dez critérios. Anteriormente, essa página era formada por 600 ms e enviava 12 solicitações ao banco de dados, agora há apenas uma:



imagem

imagem



Etapa 5. Considere o feedback do usuário após o lançamento



O desenvolvimento demorou cerca de seis meses: começamos a atualização no final de 2018 e o lançamento ocorreu em maio de 2019. A maioria dos usuários sentiu que o serviço começou a funcionar muito mais rápido. Anteriormente, o Lingualeo não conseguia treinar mais de 2.000 pessoas simultaneamente sem perder velocidade, mas agora o sistema pode suportar picos de mais de 100.000 usuários.



Algumas pessoas também notaram consequências negativas. Migrando com caixa preta, fica difícil garantir a segurança de cem por cento dos dados, por isso alguns perderam palavras do dicionário, outros exibiram incorretamente o andamento nos cursos.



Gradualmente, minha equipe e eu resolvemos todos os problemas. O principal resultado das mudanças é que agora não estamos trabalhando com uma caixa preta, mas com um sistema simples e transparente, então ficou muito mais fácil trabalhar o feedback.



Lingualeo



Em abril de 2020, durante o auto-isolamento, a carga no Lingualeo foi cinco vezes maior do que no mesmo período do ano anterior. Isso não causou problemas: a velocidade do serviço não caiu, os usuários não perceberam nada. Tenho certeza de que, se não tivéssemos atualizado o sistema, o serviço simplesmente teria falhado.



O produto não é apenas mais rápido para os usuários, mas também muito mais fácil de trabalhar: agora é mais fácil para a equipe apresentar e testar novos recursos. Organizamos a documentação e o código ficou cerca de 40 vezes menor, para que novos desenvolvedores possam descobrir facilmente como o serviço funciona.



O produto ficou mais barato, portanto, menos capacidade de computação precisa ser alugada para ele. O custo por usuário ativo no Lingualeo diminuiu mais de 50 vezes, embora após as atualizações o número de usuários ativos já tenha dobrado.



Finalmente, o produto é mais seguro. Anteriormente, quando toda a lógica de negócios estava na camada PHP, as solicitações ao banco de dados eram enviadas de diferentes funções. Um banco de dados aberto para consultas SQL é um problema: você pode fazer uma injeção SQL e forçá-lo a executar códigos perigosos, como excluir dados. Agora, nem uma única consulta SQL vem de fora, porque movemos toda a lógica para dentro. "



Queremos continuar a blogar regularmente sobre como o desenvolvimento funciona no Lingualeo atualizado. Escreva nos comentários o que vale a pena falar primeiro: nossa equipe mudou, a estrutura de gestão e a tecnologia. Teremos o maior prazer em responder a todas as suas perguntas.



All Articles