Nachrichten / Spiele

Aufbau von leistungsorientierten Microservices

Bei Roblox haben wir uns dem Microservices-Paradigma verschrieben und eine Container-basierte Entwicklungsplattform aufgebaut. Unser internationales Wachstumsteam führte diese Bemühungen an, indem es Services implementierte, die den neuen Ansatz umfassten, und neue Praktiken einführte, die auf hohe Parallelität und Skalierbarkeit abzielten. Wir schauen uns jetzt an, wie wir unsere Gesamtleistungsstatistiken verbessern können, und haben nach einigen Iterationen konsistente Ergebnisse gesehen.

Als Roblox beschloss, die Entwicklung einer Microservices- und Container-orientierten Plattform voranzutreiben, wurden viele offene Fragen aufgeworfen, wie man:

  • Erreichen Sie Reife mit der Plattform und folgen Sie der Lernkurve, um dorthin zu gelangen.
  • Reagieren Sie auf „Unbekanntes“ (wie häufige Abhängigkeitsaktualisierungen, Tool-Upgrades und andere Änderungen).
  • Strategien vereinfachen und neu schreiben, weil wir von einer monolithischen Codebasis kamen, die zu viele Probleme gleichzeitig anging.
  • Bewältigen Sie Produktionsunsicherheiten und die Bereitschaft der Infrastruktur.

Unser internationales Wachstumsteam war die ideale Speerspitze, um diese Antworten zu finden. Unsere Projekte erkundeten bereits Neuland, um Roblox in internationalen Ländern Wirklichkeit werden zu lassen – wie die Unterstützung von Rahmenwerken zur Einhaltung von Gesetzen und Vorschriften zur Bildschirmzeit. Gleichzeitig hatten unsere damals zukünftigen und heutigen Dienste keine starken Abhängigkeiten vom Rest der Plattform. Daher wurden praktische Erfahrungen mit unserem Entwicklungsprozess – von der Planung bis zur Ausführung – erwartet, um ein neues Verständnisniveau zu erreichen.

Dem „Unbekannten“ begegnen

Nach der Interstitial-Planung und Besprechungen mit dem Microservice Platform (MSP)-Team wurde uns schnell klar, dass eine neue Denkweise erforderlich war, um für das „Unbekannte“ zu planen. Eine solche Denkweise sollte alle oben genannten Bedenken ansprechen und gleichzeitig den Fortschritt mit jedem Sprint vorantreiben.

Als die Softwareentwicklung voranschritt, entschieden wir uns, mit diesem leistungsorientierten Entwicklungsansatz in das Verständnis aller Schichten vom Code bis zum Infrastrukturcluster zu investieren. Ähnlich wie bei der testgetriebenen Entwicklung wollten wir nicht nur Testfälle bestehen oder Fehler finden, sondern auch die Leistung verbessern.

Alle Bedenken wurden Metriken zugeordnet, um den Erfolg häufig zu verfolgen und umsetzbare Maßnahmen für jeden Sprint und jede Leistung zuzuweisen. Diese Bedenken ergaben sich als Möglichkeiten, unseren Prozess wie folgt zu verbessern:

https://blog.roblox.com/

Erfolg kontinuierlich messen

Leistungsaufbau ist der Prozess des kontinuierlichen Beobachtens, Verstehens und Korrigierens dessen, was auf allen Ebenen – Code, Container und Cluster – passiert, um durch Iteration einen optimalen Betrieb zu erreichen.

Schon früh bei der Entwicklung unseres ersten Microservices haben wir festgestellt, dass ein Lasttest-Framework für die Erfolgsmessung unerlässlich ist. Zu diesem Zweck haben wir ein Projekt mit Gatling zur Modellierung grundlegender Simulationen aufgesetzt. Wir haben auch festgestellt, dass das Sammeln von QA-Metriken pro Build durch die Verwendung von Sonarqube vereinfacht werden könnte.

Nach einigen Iterationen wurden diese Ideen zu einem kohärenteren Container-Framework, das in der Lage ist, Tausende von Anfragen zu simulieren und während Builds und Tests Echtzeit-Dashboards zu erstellen. Weitere Tools wurden in die Gleichung aufgenommen, um die Leistungsverfolgung zu vereinfachen. Heute haben wir die Möglichkeit, Dashboards aus mehreren Quellen zu erfassen und einen Bericht für jede Charakterisierung, jeden Belastungstest oder jedes bedeutende Ereignis zu erstellen. Dies sind nur einige Beispiele dafür, wie die kontinuierliche Iteration mit der Denkweise „Building Performance“ bereits zu Ergebnissen geführt hat.

Wenn das „Unbekannte“ vertraut wird

Kontinuierliche Profilerstellung, Charakterisierung und Belastungstests nach mehreren Sprints haben sich ausgezahlt. Wir haben mehrere Probleme auf verschiedenen Ebenen gefunden. Einige von ihnen waren einfach zu beheben, wie z. B. Protokolloptimierungen. Andere waren weniger einfach, wie z. B. Server-Tuning und Verbindungsverwaltung. Jeder Schmerzpunkt oder jede Verbesserung, die wir ansprechen, verbessert mindestens eine Metrik; Entweder durch Verkürzung der durchschnittlichen Antwortzeit oder durch mehr Anfragen mit denselben Ressourcen.

Unser Vertrauen wuchs, nachdem der erste Dienst eine große Anzahl von Datenverkehr in der Produktion erreicht hatte. Unsere Geschwindigkeit hat sich von Sprint zu Sprint dramatisch verbessert, wenn neue Dienste eingeführt oder bestehende verbessert werden. Es gibt noch Raum für Verbesserungen, aber die ersten Verbesserungen waren bereits nach wenigen Monaten sichtbar.

https://blog.roblox.com/

Der Aufbau von Wissen ist ebenfalls wichtig, und die Verteilung der Funktionalität mehrerer Dienste auf verschiedene Ingenieure hat gute Ergebnisse gezeigt. Es war nicht nur wegen des Stammes-Sharing wertvoll, sondern auch, weil jedes Mal, wenn wir die Aufführung erneut besuchen, neue Ideen auftauchen.

Wie Sie Leistung zur Priorität machen

Das Erkennen von Leistungsproblemen als Teil des Entwicklungszyklus hat sich als entscheidend für die Zukunft unseres Teams und unseres Unternehmens erwiesen. Die Anpassungen, die wir an unserem agilen Prozess und unseren Entwicklungspraktiken vorgenommen haben, sind gering im Vergleich zu den Vorteilen, die wir gesehen haben. Es ist so natürlich wie jeder andere traditionelle testbasierte Entwicklungsansatz, aber mit dem Vorteil einer besseren Vorhersagbarkeit der Skalierbarkeit und Ressourcennutzung.

Einige der Arbeiten, die wir durchgeführt haben, sind noch halbautomatisch, aber die Zukunft ist rosig. Unser Plan ist es, die vollständige Prozessautomatisierung zu übernehmen und in unsere CI/CD-Pipeline zu integrieren. Die neue Plattform beginnt damit, einige dieser Praktiken zu übernehmen, und sehr bald werden alle Backend-Teams von den von uns entwickelten Tools profitieren.

Der größte Vorteil ist, dass uns die Investition in eine leistungsorientierte Entwicklungsmentalität mit vielen zusätzlichen Möglichkeiten an die richtige Stelle gebracht hat. Die Mittel zur Überwachung der Leistung an Ihren Fingerspitzen zu haben, trägt wesentlich zur Reife unserer neuen Plattform bei. Die Verwendung von Containern für Dienste und Tools bietet eine konsistente Möglichkeit, diese Methodik zu standardisieren und überall zu replizieren.

Leistung zu einem Teil Ihres Alltags zu machen, ist der Schlüssel für die Zukunft eines jeden hochskalierbaren Dienstes.


Weder die Roblox Corporation noch dieser Blog befürworten oder befürworten ein Geschäft oder eine Dienstleistung. Darüber hinaus werden keine Garantien oder Zusicherungen hinsichtlich der Richtigkeit, Zuverlässigkeit oder Vollständigkeit der in diesem Blog enthaltenen Informationen abgegeben.

Dieser Blogbeitrag erschien ursprünglich im Roblox Tech Blog.