"Während der Quarantäne hat sich die Ladung um das Fünffache erhöht, aber wir waren bereit." Wie Lingualeo mit 23 Millionen Benutzern zu PostgreSQL wechselte

Bild



Das Lingualeo- Projekt ist bereits 10 Jahre alt. Mehr als 23 Millionen Menschen aus Russland, der Türkei, Spanien und Lateinamerika lernen mit unserem Service Englisch.



LinguaLeo wurde Ende der 2000er und Anfang der 10er Jahre entwickelt und verwendete zu dieser Zeit die fortschrittlichen Technologien und Methoden. Aber die Zeit verging und sie wurden sehr veraltet. Also beschlossen wir, das System zu aktualisieren.



Wir haben unseren Backend-Entwicklungsleiter Oleg Pravdin gebeten, darüber zu sprechen, wie er und sein Team parallel zur Unterstützung des Hauptprodukts eine neue modulare Servicestruktur auf Basis von PostgreSQL zusammengestellt, Geschäftslogik in Datenbanken übertragen und mit Millionen von Benutzern migriert haben.



Ältere Produktprobleme



„Ich bin im August 2018 nach Lingualeo gekommen, um die Backend-Entwicklung zu leiten. Damals wurde das Backing von einem Team aus 8 Entwicklern und 2 Administratoren durchgeführt, die einen Monolithen mit 1 Million Codezeilen, hauptsächlich in PHP, unterhielten. Es dauerte 2 Monate, um auch nur eine kleine neue Funktion zu implementieren. Die Infrastrukturkosten pro 10.000 aktiven Benutzern lagen über 1.000 USD pro Jahr.



Wie ist es passiert? Tatsache ist, dass sich im Laufe von 10 Jahren mehrere Entwicklungsteams im Projekt verändert haben. Neue Leute kamen, wie ich, sie fügten neue Module und Funktionen auf ihre eigene Weise hinzu. Die Teams wechselten, Neulinge verstanden nicht immer, wie die alten Teile des Systems funktionieren. Infolgedessen verwandelte sich Lingualeos Code allmählich in eine Black Box: undurchsichtige Logik im Backend, eine überlastete Front, eine Fülle von Krücken, große Lücken in der Dokumentation.



Insgesamt hatten wir 20 Entwickler in unserer Belegschaft, aber es war unmöglich, das Produkt zu entwickeln: Wenn etwas hinzugefügt wurde, traten unerwartete Probleme auf. Das Team brauchte 2-3 Wochen, um alles zu reparieren. Die Entwickler haben den Code von 2013 beibehalten, und es gab keine Ressourcen zum Aktualisieren der Funktionalität.



Dies sind die Herausforderungen, denen sich eine große Anzahl von Unternehmen gegenübersieht, die ausgereifte IT-Produkte entwickeln, die vor einem Jahrzehnt in Technologien geschrieben wurden. Trends ändern sich, aber aufgrund der alten Architektur können nicht alle neuen Elemente verwendet werden.



Das Produkt entwickelt sich und wird mit Funktionen überwachsen, aber sie haben keine Zeit, diese detailliert zu dokumentieren. Diese Probleme werden auf unterschiedliche Weise gelöst, aber wir haben uns folgendermaßen entschieden: Sie müssen ein neues System von Grund auf neu erstellen und die maximale Produktlogik beibehalten, damit sich die Benutzererfahrung in Lingualeo nicht ändert.



Schritt 1. Zusammenbau eines Prototyps der neuen Architektur



Wir mussten herausfinden, wie die technische Komponente des Dienstes aktualisiert und Lingualeo mithilfe moderner Technologien neu erstellt werden kann. Ich schlug dem Management vor, die Philosophie des Backends vollständig zu ändern: Übertragen Sie die Geschäftslogik in die Datenbank und ersetzen Sie die MySQL-Datenbank durch PostgreSQL.



Ich begann mit einem Prototyp auf Papier: Ich zeichnete eine neue Architektur, erklärte, wie ich die Leistung steigern kann und wie viel Ressourcen für die Vorbereitung erforderlich sind. Es war schwierig, das Projekt zu schützen, da es keine eindeutigen Erfolgsgeschichten gab: Niemand schreibt darüber, wie ein Dienst mit 20 Millionen Benutzern migriert werden kann, ohne das Geschäft zu stoppen. Aber Lingualeo beschloss, das Risiko einzugehen und genehmigte den Änderungsplan.



Architekturdiagramm vor der Migration



Bild



PHP, , MySQL . JSON







Bild



SQL PostgreSQL, JSON. -, , JSON



2.



Als wir unsere Pläne mit den Entwicklern teilten, wurde klar, dass das Team nicht bereit für Änderungen war. Die meisten Menschen verließen das Unternehmen: Nur diejenigen, die erst kürzlich kamen, blieben übrig. Um die Migration durchzuführen, haben wir uns entschlossen, das Entwicklungsteam wieder zusammenzustellen.



Wir waren ehrgeizig und bereit für Veränderungen, professionell und verantwortungsbewusst. Wir haben versucht, nicht nur auf die Qualität des Codes zu achten, sondern auch auf die Soft Skills. Wir haben die Architektur des Dienstes neu aufgebaut, also brauchten wir Leute, die keine Angst vor komplexen Projekten haben und bereit sind, Probleme zu lösen, mit denen sie zuvor nicht konfrontiert waren.



Einige Leute wurden zufällig gefunden, wie ich zum Beispiel: Ich habe den CEO von Lingualeo Vladimir Sirotinsky im Flugzeug getroffen. Vladimir traf den zukünftigen Front-End-Leiter bei einer Konsultation mit einem anderen Startup. Wir haben jedoch die meisten neuen Entwickler vom Markt rekrutiert. Um 8 Stellen zu besetzen, haben wir 1.118 Bewerbungen untersucht und 124 Interviews durchgeführt: Ein



Bild

Trichter von Kandidaten für neue Entwicklerstellen bei Lingualeo.



Schritt 3. Vereinfachung der Organisationsstruktur



Wir haben drei Entwicklungsbereiche: Web, Backend und mobile Anwendungen, wir haben auch eine Abteilung von Testern. Es ist sehr schwierig, in kurzer Zeit jemanden zu finden, der alle Branchen gleichzeitig versteht. Aus diesem Grund haben wir beschlossen, den technischen Direktor aufzugeben und die Organisationsstruktur des neuen Teams so flach wie möglich zu gestalten. Es gibt nur noch eine Managementebene im Unternehmen - eine Führungskraft in jede Richtung.



Wir halten regelmäßige Treffen ab und kommunizieren direkt, sodass die Entwicklung vorhersehbarer geworden ist und der Zeitrahmen verkürzt wurde. Der CTO kann irrationale Entscheidungen treffen, z. B. eine falsche Aufteilung der Verantwortlichkeiten zwischen den Teams. In einem System, in dem Leads ohne eine zusätzliche Führungsebene kommunizieren, verringert sich die Wahrscheinlichkeit irrationaler Entscheidungen: Wir können jedes Problem immer in einem persönlichen Gespräch diskutieren.



Wenn ich zum Beispiel verstehe, dass es logischer wäre, eine Funktion in der neuen Struktur in der Datenbank und nicht vorne zu implementieren, schreibe ich an den Chat und diskutiere die Idee mit dem Front-End-Leiter. Sie müssen keinen Termin mit dem CTO vereinbaren oder eine Präsentation vorbereiten, um Ihre Idee zu unterstützen.



Bild



Organisationsstruktur vor und nach den Änderungen: Wir haben den CTO in der Entwicklung eingestellt und die Struktur in der Produktabteilung vereinfacht. Heutzutage muss ein Produktdesigner nicht mehr mit zwei Führungsebenen sprechen, um eine Idee nach vorne zu bringen.



Schritt 4. Geschäftslogik in Datenbanken übertragen



In der Vergangenheit stand die Geschäftslogik von Lingualeo im Vordergrund und in Anwendungen. Produktfunktionen wurden von Systemen wie JavaScript oder PHP-Code verwaltet, die nicht für die Verarbeitung von Daten ausgelegt waren. Aus diesem Grund haben wir die Lingualeo-Geschäftslogik auf PostgreSQL-Datenbanken portiert.



Dschungel



Einer der 4 Hauptabschnitte des Lingualeo-Dienstes ist Jungle . Dies ist eine Reihe von Materialien in einer Fremdsprache - Texte, Audio und Video -, in denen Sie die Übersetzung für jedes Wort erkennen können. Das heißt, Benutzer studieren echte Inhalte auf Englisch. Wenn etwas nicht klar ist, können sie auf ein Wort im Text oder in Untertiteln für ein Video klicken und die Übersetzung sehen.



Text im Dschungel



Bild



Video im Dschungel



Bild



Damit die Übersetzung von Wörtern mit einem Klick funktioniert, muss der Text in Wörter, Ausdrücke und Phrasen unterteilt werden. Dann - beziehen Sie sich auf das Wörterbuch und zeigen Sie dem Benutzer die Übersetzung in einem neuen Fenster über dem Text an. Es ist ziemlich schwierig, den zu übersetzenden Text aufzuteilen: Es gibt feste Ausdrücke und Phrasenverben, deren Aufteilung in zwei Wörter keinen Sinn macht. Zum Beispiel sind Start und Start verschiedene Inhaltseinheiten, obwohl sie dasselbe Wort enthalten.



Die gesamte Logik für diese Funktion sowie Ausnahmen und komplexe Regeln für die Textteilung wurden zuvor in JavaScript auf der Vorderseite geschrieben. Die Funktion war sehr umständlich und die Übersetzung konnte lange dauern.



Wir haben diese Funktion in der Datenbank implementiert. Durch das Backing wird ein vorgefertigtes JSON nach vorne gesendet, in dem der Text bereits in Wörter und Ausdrücke unterteilt ist. Jedem Wort und Ausdruck in der Datenbank wird eine ID zugewiesen, die das Auffinden einer Übersetzung erleichtert. Außerdem berücksichtigt JSON, welche Wörter der Benutzer im Wörterbuch hat und welche noch nicht. An der Vorderseite müssen nur noch Informationen angezeigt und Wörter mit bestimmten Zeichen hervorgehoben werden.



Wörterbücher



Dasselbe haben wir mit dem Abschnitt Wörterbücher gemacht : Die gesamte Arbeit findet jetzt in der Datenbank statt. Wir haben Benutzer, die mehr als 100.000 Wörter und Ausdrücke in ihrem Wörterbuch haben. Im Wörterbuch müssen Sie eine bequeme Suche bereitstellen, Wörter in Gruppen unterteilen und dem Benutzer eine breite Palette von Filtern zur Verfügung stellen.



Früher befand sich die Logik der Wörterbücher auf der Vorderseite oder in der PHP-Schicht, jetzt verfügt das System über eine vollwertige API zwischen Front- und Backend. Sie können eine Anfrage mit einer großen Anzahl von Parametern an die Datenbank senden, und von dort kommt ein vorgefertigter JSON:



Bild



Wörterbuchfilter: Suche nach Wörtern, Auswahl von Wörtern nach Trainingsart, Auswahl zwischen Wörtern und Phrasen, Filterung nach gelernten und neuen Wörtern



Kurse



Durch die Übertragung der Geschäftslogik in die Datenbank wurde die Codemenge erheblich reduziert und der Service beschleunigt. Beispielsweise wurde der Backend-Code der Seite " Kurse " nach der Migration geändert . Es wird von registrierten Benutzern gesehen und die Kurse dort werden vom System nach zehn Kriterien ausgewählt. Früher wurde eine solche Seite für 600 ms erstellt und 12 Anforderungen an die Datenbank gesendet, jetzt gibt es nur noch eine:



Bild

Bild



Schritt 5. Berücksichtigen Sie das Benutzerfeedback nach der Veröffentlichung



Die Entwicklung dauerte ungefähr sechs Monate: Wir haben Ende 2018 mit der Aktualisierung begonnen, und die Veröffentlichung fand im Mai 2019 statt. Die meisten Benutzer waren der Meinung, dass der Dienst viel schneller funktioniert. Früher konnte Lingualeo nicht mehr als 2.000 Personen gleichzeitig trainieren, ohne an Geschwindigkeit zu verlieren. Jetzt kann das System Spitzenwerten von mehr als 100.000 Benutzern standhalten.



Einige Leute bemerkten auch negative Konsequenzen. Bei der Migration mit einer Black Box ist es schwierig, die Sicherheit von hundert Prozent der Daten zu gewährleisten. Einige haben Wörter aus dem Wörterbuch verloren, andere haben den Fortschritt in den Kursen falsch angezeigt.



Allmählich haben mein Team und ich alle Probleme behoben. Das Hauptergebnis der Änderungen ist, dass wir jetzt nicht mit einer Black Box arbeiten, sondern mit einem einfachen und transparenten System, sodass es viel einfacher war, das Feedback herauszuarbeiten.



Lingualeo



Im April 2020 war die Arbeitsbelastung von Lingualeo während der Selbstisolierung fünfmal höher als vor einem Jahr. Dies verursachte keine Probleme: Die Geschwindigkeit des Dienstes sank nicht, die Benutzer bemerkten nichts. Ich bin sicher, wenn wir das System nicht aktualisiert hätten, wäre der Dienst einfach fehlgeschlagen.



Das Produkt ist nicht nur für Benutzer schneller geworden, sondern auch viel einfacher zu bearbeiten: Es ist jetzt für das Team einfacher, neue Funktionen einzuführen und zu testen. Wir haben die Dokumentation aufgeräumt und der Code ist etwa 40-mal kleiner geworden, sodass neue Entwickler leicht herausfinden können, wie der Service funktioniert.



Das Produkt ist billiger geworden, daher muss weniger Rechenleistung dafür gemietet werden. Die Kosten pro aktivem Benutzer in Lingualeo sind um mehr als das 50-fache gesunken, obwohl sich die Anzahl der aktiven Benutzer nach den Aktualisierungen bereits verdoppelt hat.



Schließlich ist das Produkt sicherer. Früher, als sich die gesamte Geschäftslogik in der PHP-Schicht befand, wurden von dort aus Anforderungen von verschiedenen Funktionen an die Datenbank gesendet. Eine Datenbank, die für SQL-Abfragen geöffnet ist, ist ein Problem: Sie können eine SQL-Injection durchführen und sie zwingen, gefährlichen Code auszuführen, z. B. das Löschen von Daten. Jetzt kommt keine einzige SQL-Abfrage von außen, da wir die gesamte Logik nach innen verschoben haben. "



Wir möchten weiterhin regelmäßig darüber bloggen, wie die Entwicklung im aktualisierten Lingualeo funktioniert. Schreiben Sie in die Kommentare, worüber Sie zuerst sprechen sollten: Unser Team hat sich geändert, die Managementstruktur und die Technologie. Gerne beantworten wir Ihre Fragen.



All Articles