In diesem FrĂŒhjahr fanden wir uns in einer sehr unterhaltsamen Situation wieder. Aufgrund der Pandemie wurde klar, dass wir unsere Sommerkonferenzen online abhalten mussten. Um dies jedoch qualitativ hochwertig zu gestalten, genĂŒgten uns die verfĂŒgbaren Softwarelösungen nicht, wir mussten unsere eigene schreiben. Und dafĂŒr hatten wir drei Monate Zeit.
Es ist offensichtlich, dass dies spannende drei Monate waren. Aber von auĂen ist es nicht ganz klar: Was genau ist eigentlich eine Plattform fĂŒr Online-Konferenzen? Aus welchen Teilen setzt sie sich zusammen? Daher habe ich auf der letzten Sommerkonferenz DevOops einige Fragen an die Personen gerichtet, die fĂŒr diese Aufgabe verantwortlich waren:
- Nikolai Moltschanov â Technischer Direktor der JUG Ru Group;
- Wladimir Krasilschik â pragmatischer Java-Programmierer, der sich mit Backend beschĂ€ftigt (Sie haben vielleicht auch seine VortrĂ€ge auf unseren Java-Konferenzen gesehen);
- Artem Nikonych â verantwortlich fĂŒr unseren gesamten Videostreaming.
Ăbrigens werden wir bei den Herbst-Winter-Konferenzen eine verbesserte Version derselben Plattform verwenden â viele Hubschreiber werden also ebenfalls Nutzer sein.

Gesamtbild
â Wie war die Zusammensetzung des Teams?
Nikolai Moltschanov: Wir haben einen Analysten, einen Designer, einen Tester, drei Frontend-Entwickler und einen Backend-Entwickler. Und natĂŒrlich einen T-shaped Spezialisten!
â Wie sah der Prozess insgesamt aus?
Nikolaj: Bis Mitte MĂ€rz waren wir fĂŒr den Online-Betrieb ĂŒberhaupt nicht bereit. Am 15. MĂ€rz begann dann das gesamte Online-GeschĂ€ft. Wir haben einige Repositories angelegt, die grundlegende Architektur geplant, diskutiert und alles innerhalb von drei Monaten umgesetzt.
NatĂŒrlich durchliefen wir die klassischen Phasen: Planung, Architektur, Auswahl der Funktionen, Abstimmung ĂŒber diese Funktionen, deren Richtlinien, Design, Entwicklung und Tests. Am 6. Juni haben wir alles live geschaltet auf . DafĂŒr hatten wir insgesamt 90 Tage.
â Haben wir es geschafft, das zu erreichen, was wir uns vorgenommen hatten?
Nikolaj: Da wir jetzt online an der DevOops-Konferenz teilnehmen â haben wir es geschafft. Ich habe mich persönlich verpflichtet, den Kunden ein Tool zur VerfĂŒgung zu stellen, mit dem sie eine Konferenz online durchfĂŒhren können.
Die Aufgabe lautete: Geben Sie uns ein Werkzeug, mit dem wir unsere Konferenzen an die Ticketinhaber ĂŒbertragen können.
Die gesamte Planung war in mehrere Phasen unterteilt, und alle Funktionen (etwa 30 globale) wurden in 4 Kategorien eingeteilt:
- die wir unbedingt machen werden (ohne sie können wir nicht leben),
- die wir als nÀchstes angehen werden,
- die wir niemals machen werden,
- und die wir niemals, niemals machen werden.
Alle Funktionen aus den ersten beiden Kategorien haben wir umgesetzt.
â Ich weiĂ, dass insgesamt 600 JIRA-Tickets angelegt wurden. In drei Monaten habt ihr 13 Mikrosysteme entwickelt, und ich vermute, dass sie nicht nur in Java geschrieben sind. Ihr habt verschiedene Technologien verwendet, zwei Kubernetes-Cluster in drei VerfĂŒgbarkeitszonen eingerichtet und 5 RTMP-Streams in Amazon bereitgestellt.
Lassen Sie uns nun jede Komponente des Systems einzeln betrachten.
Streaming
â Fangen wir damit an, wenn wir bereits ein Video-Bild haben, das an verschiedene Dienste ĂŒbermittelt wird. Artyom, erzĂ€hl uns, wie dieses Streaming ablĂ€uft?
Artyom NikĐŸĐœĐŸĐČ: Das Gesamtschema sieht so aus: Kamera -> unser Steuerpult -> lokaler RTMP-Server -> Amazon -> Videoplayer. Mehr dazu auf HabrĂ© im Juni geschrieben.
Es gibt grundsĂ€tzlich zwei globale AnsĂ€tze, wie man das machen kann: entweder mit Hardware oder auf Basis von Softwarelösungen. Wir haben uns fĂŒr den Weg der Software entschieden, da dies bei entfernten Sprecherinnen und Sprechern einfacher ist. Nicht immer ist es möglich, ein GerĂ€t zu einem Sprecher im Ausland zu bringen, wĂ€hrend die Installation von Software fĂŒr den Sprecher einfacher und zuverlĂ€ssiger erscheint.
Im Hinblick auf die Hardware verfĂŒgen wir ĂŒber eine bestimmte Anzahl von Kameras (in unseren Studios und bei entfernten Sprechern) sowie ĂŒber eine Reihe von Regiepulten im Studio, die manchmal wĂ€hrend des Live-Streams direkt unter dem Tisch repariert werden mĂŒssen.
Die Signale von diesen GerÀten gelangen in Computer mit Capture-, Ein- und Ausgangskarten sowie Soundkarten. Dort werden die Signale gemischt und in Layouts zusammengestellt:

Beispiel eines Layouts mit 4 Sprechern

Beispiel eines Layouts mit 4 Sprechern
Ein kontinuierlicher Live-Stream wird mithilfe von drei Computern sichergestellt: Es gibt einen Hauptcomputer und zwei, die abwechselnd arbeiten. Der erste Computer behandelt den ersten Vortrag, der zweite â die Pause, dann der erste â den nĂ€chsten Vortrag, der zweite â die nĂ€chste Pause und so weiter. Der Hauptcomputer mischt den ersten mit dem zweiten.
So entsteht eine Art Dreieck, und im Falle eines Ausfalls eines dieser Knoten können wir schnell und ohne QualitÀtsverlust weiterhin Inhalte an die Kunden liefern. Eine solche Situation hatten wir. In der ersten Woche der Konferenzen haben wir eine Maschine repariert, ein- und ausgeschaltet. Es scheint, dass die Leute mit unserer Ausfallsicherheit zufrieden sind.
Die Streams von den Computern gelangen dann auf einen lokalen Server, der zwei Aufgaben hat: die RTMP-Streams zu routen und ein Backup zu erstellen. So haben wir mehrere Aufnahmepunkte. Dann werden die Videoströme an einen Teil unseres Systems gesendet, der auf den SaaS-Diensten von Amazon basiert. Wir nutzen , S3, CloudFront.
Nikolaj: Was passiert, bevor die Videos zu den Zuschauern gelangen? Ihr mĂŒsst es doch irgendwie schneiden?
Artyom: Wir komprimieren das Video von unserer Seite, senden es zu MediaLive. Dort starten wir die Transcoder. Sie transkodieren das Video in Echtzeit in mehrere Auflösungen, damit die Leute es auf ihren Handys, ĂŒber eine schlechte Internetverbindung im Ferienhaus usw. anschauen können. Dann werden diese Streams in zerteilt, so funktioniert das Protokoll . Im Frontend geben wir eine Playlist aus, die auf diese Chunks verweist.
â Verwenden wir eine Auflösung von 1080p?
Artyom: In der Breite entspricht unser 1080p-Video 1920 Pixeln, aber in der Höhe ist es etwas weniger, das Bild ist lĂ€nger gestreckt â dafĂŒr gibt es spezielle GrĂŒnde.
Player
â Artyom hat beschrieben, wie das Video in die Streams gelangt, wie es auf verschiedene Playlists fĂŒr unterschiedliche Bildschirmauflösungen verteilt und in Chunks unterteilt wird, bevor es im Player angezeigt wird. Kolya, erzĂ€hl jetzt, was dieser Player ist, wie er den Stream verarbeitet und warum HLS?
Nikolaj: Wir haben einen Player, den alle Teilnehmer der Konferenz beobachten.

Im Grunde ist es eine Wrapper-Bibliothek , auf der viele andere Player basieren. Aber wir benötigten eine sehr spezifische FunktionalitĂ€t: die Möglichkeit, zurĂŒckzuspulen und zu markieren, an welcher Stelle sich die Person befindet, welcher Vortrag sie sich gerade ansieht. AuĂerdem brauchten wir eigene Layouts, Logos und alles andere, was wir integriert haben. Daher haben wir beschlossen, unsere eigene Bibliothek (eine Wrapper ĂŒber HLS) zu erstellen und dies in die Website zu integrieren.
Das ist die grundlegende FunktionalitÀt, die daher fast als erste umgesetzt wurde. Darum herum hat sich dann alles andere entwickelt.
TatsĂ€chlich erhĂ€lt der Player ĂŒber die Authentifizierung vom Backend eine Playlist mit Links zu den Chunks, die mit Zeit und QualitĂ€t verknĂŒpft sind, lĂ€dt die benötigten herunter und zeigt sie dem Benutzer an, wĂ€hrend er dabei eine gewisse "Magie" entfaltet.

Beispiel eines Zeitplans
â Direkt im Player ist ein Button integriert, um den Zeitplan aller VortrĂ€ge anzuzeigenâŠ
Nikolaj: Ja, wir haben sofort das Problem der Benutzernavigation angegangen. Mitte April haben wir entschieden, dass wir nicht jede unserer Konferenzen auf einer separaten Website streamen werden, sondern alles auf einer einzigen Plattform zusammenfassen. So können Inhaber eines Full Pass-Tickets frei zwischen verschiedenen Konferenzen wechseln: sowohl dem Live-Stream als auch den Aufzeichnungen vergangener Veranstaltungen.
Um es den Nutzern zu erleichtern, sich im aktuellen Stream zu bewegen und zwischen den Tracks zu wechseln, haben wir den Button "Gesamter Stream" und horizontale Karten fĂŒr die VortrĂ€ge erstellt, um zwischen Tracks und VortrĂ€gen zu wechseln. Dort gibt es Steuerungsoptionen von der Tastatur.
â Gab es technische Schwierigkeiten dabei?
Nikolaj: Es gab Probleme mit der Scroll-Leiste, auf der die Anfangspunkte der verschiedenen VortrÀge markiert sind.
â Habt ihr diese Markierungen auf der Scroll-Leiste umgesetzt, bevor YouTube etwas Ăhnliches gemacht hat?
Artyom: Damals war das bei ihnen noch in der Beta-Phase. Es scheint eine ziemlich komplexe Funktion zu sein, da sie diese teilweise im letzten Jahr bei Nutzern getestet haben. Jetzt ist sie endlich im Verkauf.
Nikolaj: Wir haben das tatsÀchlich schneller in den Verkauf gebracht. Um ganz ehrlich zu sein, hinter dieser einfachen Funktion steckt eine riesige Menge an Backend, Frontend, Berechnungen und Mathematik im Player.
Frontend
Lassen Sie uns klÀren, wie die Inhalte, die wir anzeigen (Berichtskarte, Sprecher, Website, Zeitplan), ins Frontend gelangen?
Wladimir Krasyllschik: Wir haben mehrere interne IT-Systeme. Es gibt ein System, in dem alle Berichte und Sprecher erfasst sind. Es gibt einen Prozess, bei dem der Redner an der Konferenz teilnimmt. Der Sprecher reicht einen Antrag ein, das System erfasst diesen, danach gibt es einen gewissen Pipeline-Prozess, durch den der Bericht erstellt wird.

So sieht der Sprecher die Pipeline.
Dieses System ist unsere interne Entwicklung.
Aus den einzelnen Berichten muss ein Zeitplan erstellt werden. Wie bekannt ist, handelt es sich dabei um ein NP-schweres Problem, aber wir lösen es irgendwie. Dazu starten wir eine andere Komponente, die den Zeitplan erstellt und ihn in den externen Cloud-Dienst Contentful integriert. Dort erscheint alles in Form einer Tabelle, die die Konferenztage, die Zeitfenster an diesen Tagen und in den Zeitfenstern â PrĂ€sentationen, Pausen oder SponsoraktivitĂ€ten â enthĂ€lt. Der Inhalt, den wir sehen, befindet sich also in einem externen Dienst. Unsere Aufgabe ist es, diesen Inhalt auf die Website zu bringen.
Auf den ersten Blick scheint die Website lediglich eine Seite mit einem Player zu sein, und es ist nichts dabei. AuĂer, dass es nicht so einfach ist. Das Backend, das hinter dieser Seite steht, greift auf Contentful zu, holt dort den Zeitplan ab, erstellt einige Objekte und sendet diese an das Frontend. Ăber eine Websocket-Verbindung, die jeder Kunde unserer Plattform herstellt, senden wir aktualisierte Informationen zum Zeitplan vom Backend direkt an das Frontend.
Echter Fall: Der Sprecher hat wĂ€hrend der Konferenz den Job gewechselt. Wir mĂŒssen ihm das Firmen-Label anpassen. Wie geschieht das im Backend? Ăber Websockets wird eine Aktualisierung an alle Clients gesendet, und dann aktualisiert das Frontend selbststĂ€ndig die Timeline. Dieser Prozess lĂ€uft nahtlos ab. Die Kombination aus unserem Cloud-Service und mehreren Komponenten ermöglicht es uns, all diese Inhalte zu erstellen und dem Frontend zur VerfĂŒgung zu stellen.
Nikolaj: Hier ist es wichtig zu klĂ€ren, dass unsere Website nicht nur eine klassische SPA-Anwendung ist. Es ist sowohl eine gerenderte als auch eine gebaute Website. TatsĂ€chlich sieht Google diese Seite als gerendertes HTML. Das ist gut fĂŒr SEO und fĂŒr die Bereitstellung von Inhalten an den Benutzer. Er muss nicht auf 1,5 Megabyte JavaScript warten, um die Seite zu sehen; er sieht sofort die gerenderte Seite, und Sie spĂŒren das jedes Mal, wenn Sie zwischen den PrĂ€sentationen wechseln. Alles geschieht in einer halben Sekunde, da die Inhalte bereits bereitgestellt und am richtigen Ort abgelegt sind.
â Lassen Sie uns die oben genannten Punkte zusammenfassen, indem wir die Technologien auflisten. TŃma hat erklĂ€rt, dass wir 5 Amazon-Streams haben, ĂŒber die wir Video und Audio liefern. Dort verwenden wir Bash-Skripte, um sie zu starten und zu konfigurieren...
Artyom: Das erfolgt ĂŒber die AWS-API, wo es noch viele andere technische Begleitdienste gibt. Wir haben unsere Aufgaben so aufgeteilt, dass ich Inhalte aufliefern kann an , wĂ€hrend Frontend- und Backend-Entwickler diese abholen. Wir verfĂŒgen ĂŒber einige eigene Anbindungen zur Vereinfachung der Bereitstellung von Inhalten, die wir spĂ€ter in 4K erstellen usw. Aufgrund der engen Zeitvorgaben haben wir praktisch alles auf Basis von AWS realisiert.
â AnschlieĂend gelangt alles in den Player ĂŒber das Backend-System. Unser Player nutzt TypeScript, React, Next.js. Und im Backend haben wir mehrere Dienste in C#, Java, Spring Boot und Node.js. Alles wird mithilfe von Kubernetes bereitgestellt, unter Verwendung der Infrastruktur von Yandex.Cloud.
Ich möchte auĂerdem anmerken, dass es mir, als ich mich mit der Plattform vertraut machen musste, nicht schwer fiel: Alle Repositories sind auf GitLab, alles ist gut benannt, es gibt Tests und Dokumentation. Das heiĂt, selbst im Intensivbetrieb wurde auf solche Aspekte geachtet.
GeschÀftsrestriktionen und Analytik
â Wir haben uns auf die geschĂ€ftlichen Anforderungen von 10.000 Nutzern konzentriert. Nun ist es an der Zeit, ĂŒber die geschĂ€ftlichen EinschrĂ€nkungen zu sprechen, mit denen wir konfrontiert waren. Wir mussten eine hohe Last garantieren und die Einhaltung des Datenschutzgesetzes sicherstellen. Was gab es noch?
Nikolaj: UrsprĂŒnglich basierten wir auf den Anforderungen an das Video. Das Wichtigste war die verteilte Speicherung von Videos weltweit fĂŒr eine schnelle Bereitstellung an den Kunden. Weitere Anforderungen waren eine 1080p Auflösung und die Möglichkeit, zurĂŒckzuspulen, was viele andere Anbieter im Live-Modus nicht implementiert haben. SpĂ€ter fĂŒgten wir die Funktion hinzu, die Wiedergabegeschwindigkeit auf 2x zu erhöhen, mit der man "aufschlieĂen" und die Konferenz in Echtzeit weiterverfolgen kann. AuĂerdem entwickelte sich wĂ€hrenddessen eine FunktionalitĂ€t zur Zeitachsenmarkierung. DarĂŒber hinaus mussten wir ausfallsicher sein und eine Last von 10.000 Verbindungen bewĂ€ltigen. Betrachtet man den Backend-Bereich, bedeutet das etwa 10.000 Verbindungen multipliziert mit 8 Anfragen bei jedem Seiten-Refresh. Das sind bereits 80.000 RPS/Sekunde. Eine erhebliche Menge.
â Gab es auch Anforderungen an eine "virtuelle Ausstellung" mit Online-StĂ€nden der Partner?
Nikolaj: Ja, das musste ziemlich schnell und universell erledigt werden. Wir hatten bis zu 10 Partnerunternehmen fĂŒr jede Konferenz, und deren Seiten mussten innerhalb einer Woche oder zwei gestaltet werden. Dabei unterscheidet sich der Inhalt etwas im Format. Es wurde jedoch ein bestimmter Template-Generator erstellt, der diese Seiten in Echtzeit zusammenstellt, praktisch ohne weitere Entwicklungsbeteiligung.
â Es gab auch Anforderungen an die Echtzeit-Analyse der Ansichten und Statistiken. Ich weiĂ, dass wir dafĂŒr Prometheus verwenden. Können Sie genauer erzĂ€hlen, welche Anforderungen wir in Bezug auf die Analyse erfĂŒllen und wie dies umgesetzt wird?
Nikolaj: UrsprĂŒnglich hatten wir marketingtechnische Anforderungen an die Datenerhebung fĂŒr A/B-Tests und zur Informationssammlung, um zu verstehen, wie wir dem Kunden zukĂŒnftig die besten Inhalte liefern können. Es gibt auch Anforderungen fĂŒr bestimmte Analysen zu PartneraktivitĂ€ten und die Analysen, die Sie sehen (BesucherzĂ€hler). Alle Informationen werden in Echtzeit gesammelt.
Diese Informationen können wir sogar in aggregierter Form bereitstellen, z. B. wie viele Menschen dich zu einem bestimmten Zeitpunkt angesehen haben. Dabei werden jedoch zur Einhaltung des Gesetzes Nr. 152 die persönlichen Daten und der Zugang zum persönlichen Bereich nicht verfolgt.
Die Plattform verfĂŒgt bereits ĂŒber Marketinginstrumente sowie unsere Metriken zur Messung der BenutzeraktivitĂ€t in Echtzeit (wer zu welchem Zeitpunkt die PrĂ€sentation angesehen hat), um Besuchsgrafiken zu erstellen. Diese Daten werden fĂŒr Forschungen genutzt, die helfen, zukĂŒnftige Konferenzen zu verbessern.
Betrug
â Haben wir Anti-Betrugs-Mechanismen?
Nikolaj: Aufgrund der strengen zeitlichen Vorgaben wurde von Anfang an nicht die Strategie verfolgt, unnötige Verbindungen sofort zu blockieren. Wenn zwei Benutzer dasselbe Konto verwendeten, konnten sie den Inhalt ansehen. Aber wir wissen, wie viele gleichzeitige Ansichten von einem Konto aus stattfanden. Einige besonders hartnĂ€ckige ĂbeltĂ€ter wurden gesperrt.
Wladimir: Man muss sagen, einer der gesperrten Benutzer hat verstanden, warum das passiert ist. Er kam, entschuldigte sich und versprach, ein Ticket zu kaufen.
â Damit dies alles funktioniert, mĂŒssen Sie alle Nutzer vom Eintritt bis zum Austritt vollstĂ€ndig nachverfolgen und immer wissen, was sie tun. Wie funktioniert dieses System?
Wladimir: Ich möchte ĂŒber die Analytik und die Statistiken sprechen, die wir dann analysieren, um den Erfolg des Vortrags zu bewerten oder die wir spĂ€ter unseren Partnern bereitstellen können. Alle Kunden sind ĂŒber eine WebSocket-Verbindung mit einem bestimmten Backend-Cluster verbunden. Dort steht . Jeder Kunde sendet in regelmĂ€Ăigen AbstĂ€nden Informationen darĂŒber, was er tut und welchen Track er sich ansieht. Diese Informationen werden dann zĂŒgig durch Hazelcast-Jobs aggregiert und an alle zurĂŒckgesendet, die diese Tracks gerade ansehen. Wir sehen in der Ecke, wie viele Menschen gerade mit uns zusammen sind.

Diese Informationen werden auch in gespeichert und wandern in unser Datenspeicher, aus dem wir interessantere Diagramme erstellen können. Es stellt sich die Frage: Wie viele einzigartige Nutzer haben diesen Vortrag gesehen? Wir gehen zu , wo die Pings aller Personen, die ĂŒber die ID dieses Vortrags gekommen sind, gesammelt werden. Wir aggregieren die einzigartigen Nutzer und können jetzt verstehen.
Nikolaj: Aber gleichzeitig erhalten wir auch Echtzeitdaten von Prometheus. Er ist auf alle Kubernetes-Dienste und Kubernetes selbst eingestellt. Er sammelt alles, und mit Grafana können wir in Echtzeit beliebige Diagramme erstellen.
Wladimir: Einerseits laden wir das fĂŒr die weitere Verarbeitung im OLAP-Stil hoch. Das OLTP-Anwendungssystem lĂ€dt all dies in Prometheus, Grafana, und die Diagramme stimmen sogar ĂŒberein!
â Das ist der Fall, bei dem die Diagramme ĂŒbereinstimmen.
Dynamische Ănderungen
â ErzĂ€hlen Sie, wie dynamische Ănderungen ausgerollt werden: Wenn ein Vortrag 6 Minuten vor Beginn abgesagt wird, welche Handlungsfolge gibt es? Welcher Pipeline wird aktiviert?
Wladimir: Die Pipeline ist sehr bedingt. Es gibt mehrere Möglichkeiten. Die erste ist, dass das Programm zur Planung des Zeitplans aktiviert wird und diesen Ă€ndert. Der geĂ€nderte Zeitplan wird in Contentful hochgeladen. Danach versteht das Backend, dass es Ănderungen zu dieser Konferenz in Contentful gibt, ĂŒbernimmt das und baut neu auf. Alles wird zusammengestellt und ĂŒber Websocket gesendet.
Die zweite Möglichkeit ist, wenn alles ganz schnell ablÀuft: Der Redakteur Àndert die Informationen in Contentful manuell (den Link zu Telegram, die PrÀsentation des Referenten usw.) und dieselbe Logik wird aktiviert wie beim ersten Mal.
Nikolaj: Alles geschieht ohne ein Neuladen der Seite. Alle Ănderungen erfolgen nahtlos fĂŒr den Kunden. Das gilt auch fĂŒr den Wechsel der VortrĂ€ge. Wenn die Zeit gekommen ist, Ă€ndert sich der Vortrag und das Interface.
Wladimir: Ebenso die Zeitmarken fĂŒr den Beginn der VortrĂ€ge in der Timeline. Am Anfang ist nichts vorhanden. Wenn man mit der Maus ĂŒber den roten Balken fĂ€hrt, erscheinen zu einem bestimmten Zeitpunkt, dank des Regisseurs der Ăbertragung, die Zeitmarken. Der Regisseur setzt den richtigen Beginn der Ăbertragung, das Backend erfasst diese Ănderung, berechnet entsprechend dem Zeitplan der Konferenz die Start- und Endzeit der VortrĂ€ge und sendet diese an unsere Kunden, die das Interface zeichnen. Jetzt kann der Nutzer problemlos zu Beginn und Ende des Vortrags navigieren. Das war eine wichtige GeschĂ€ftsanforderung, sehr praktisch und nĂŒtzlich. Man spart Zeit, um den genauen Beginn des Vortrags zu finden. Wenn wir die Vorschau erstellen, wird es wirklich groĂartig sein.
Deployment
â Ich wĂŒrde gerne etwas zum Deployment fragen. Kolja und das Team haben zu Beginn viel Zeit damit verbracht, die gesamte Infrastruktur einzurichten, in der alles bereitgestellt wird. ErzĂ€hl mir, aus welchen Komponenten besteht das alles?
Nikolaj: Zu Beginn hatten wir die Anforderung, das Produkt technisch so weit wie möglich von einem bestimmten Anbieter zu abstrahieren. Es passte nicht wirklich, spezifische Terraform-Skripte fĂŒr AWS, Yandex oder Azure zu erstellen. Wir mussten damals woanders hinziehen.
In den ersten drei Wochen suchten wir stĂ€ndig einen Weg, wie wir es am besten umsetzen können. Letztendlich haben wir festgestellt, dass Kubernetes in diesem Fall unsere beste Lösung ist, da es automatisch skalierbare Dienste sowie Rollouts ermöglicht und fast alle Dienste sofort verfĂŒgbar sind. NatĂŒrlich mussten wir alle Dienste auf die Arbeit mit Kubernetes und Docker schulen, und das Team musste ebenfalls lernen.
Wir haben zwei Cluster: einen Test- und einen Produktionscluster. Diese sind hinsichtlich Hardware und Einstellungen völlig identisch. Wir implementieren Infrastruktur als Code. Alle Dienste werden ĂŒber automatisierte Pipelines in drei Umgebungen aus Feature-Branches, aus Master-Branches und aus Test-Branches aus GitLab bereitgestellt. Das ist maximal in GitLab integriert und arbeitet nahtlos mit Elastic und Prometheus zusammen.
Wir können schnell Ănderungen in jede Umgebung ausrollen (Backend innerhalb von 10 Minuten, Frontend innerhalb von 5 Minuten) mit allen Tests, Integrationen, dem Start funktionaler Tests sowie Integrationstests in der Testumgebung. AuĂerdem testen wir Belastungstests, um sicherzustellen, dass wir im Produktionsumfeld das Gleiche erhalten.
Zu den Tests
â Sie testen fast alles, es ist schwer zu glauben, wie grĂŒndlich Sie das umgesetzt haben. Können Sie etwas ĂŒber die Tests im Backend erzĂ€hlen: Wie umfassend ist die Abdeckung, welche Tests werden durchgefĂŒhrt?
Wladimir: Es gibt zwei Arten von Tests. Die ersten sind Kompontententests. Tests der gesamten Spring-Anwendung und Datenbank in . Dies prĂŒft die hochgradig geschĂ€ftskritischen Szenarien. Ich teste keine Funktionen, sondern konzentriere mich nur auf gröĂere AblĂ€ufe. Beispielsweise wird im Test der Login-Prozess eines Benutzers emuliert, einschlieĂlich der Abfrage von Tickets, die er erwerben kann, sowie des Zugriffs auf Streaming-Inhalte. Sehr nachvollziehbare Benutzer-Szenarien.
Ăhnliches wird in sogenannten Integrationstests umgesetzt, die tatsĂ€chlich in der Umgebung laufen. Wenn ein neuer Deployment in die Produktion erfolgt, werden in der Produktion auch echte Basisszenarien ausgefĂŒhrt. Das umfasst den gleichen Login, Ticketanfragen, Zugriffsanforderungen an CloudFront, sowie die ĂberprĂŒfung, ob der Stream tatsĂ€chlich mit meinen Berechtigungen verbunden ist, und die PrĂŒfung der RegieoberflĂ€che.
Aktuell habe ich etwa 70 Komponententests und rund 40 Integrationstests im Einsatz. Die Abdeckung liegt sehr nahe bei 95 %. Bei den Komponententests, bei den Integrationstests ist es etwas weniger, da dort einfach nicht so viele notwendig sind. Angesichts der Codegenerierung im Projekt ist das ein sehr guter Wert. Es gab keinen anderen Weg, um das, was wir in drei Monaten erreicht haben, zu realisieren. HĂ€tten wir manuell getestet und die Funktionen an unsere Testerin ĂŒbergeben, wĂ€hrend sie Fehler gefunden und uns zur Behebung zurĂŒckgeschickt hĂ€tte, wĂ€re dieser gesamte Prozess des Code-Debuggings sehr lange gedauert und wir hĂ€tten keine Fristen einhalten können.
Nikolaj: Um eine Regression auf der gesamten Plattform bei einer Ănderung einer Funktion durchzufĂŒhren, mĂŒsste man zwei Tage lang ĂŒberall herumklicken.
Wladimir: Es ist also ein groĂer Erfolg, dass, wenn ich eine Funktion schĂ€tze, ich sage, dass ich 4 Tage fĂŒr zwei einfache Features und 1 Websocket brauche, Kola zustimmt. Er ist bereits daran gewöhnt, dass in diesen 4 Tagen 2 Arten von Tests eingeplant sind und es wahrscheinlich danach funktionieren wird.
Nikolaj: Ich habe auch 140 Tests geschrieben: Komponenten- und Funktionstests, die dasselbe tun. Alle Szenarien werden sowohl in der Produktion, im Test als auch in der Entwicklung getestet. AuĂerdem haben wir kĂŒrzlich grundlegende UI-Funktionstests eingefĂŒhrt. Damit decken wir die grundlegendsten Funktionen ab, die fehleranfĂ€llig sein könnten.
Wladimir: NatĂŒrlich sollte ich ĂŒber Lasttests sprechen. Wir mussten die Plattform unter einer nahezu realistischen Last testen, um zu verstehen, was mit Rabbit und den JVMs passiert und wie viel Speicher tatsĂ€chlich benötigt wird.
â Ich weiĂ nicht genau, ob wir etwas auf der Streaming-Seite testen, aber ich erinnere mich, dass es Probleme mit den Transcodern gab, als wir Meetups gemacht haben. Haben wir die Streams getestet?
Artyom: Wir haben iterativ getestet und Meetups organisiert. Bei der Organisation der Meetups gab es etwa 2300 JIRA-Tickets. Das waren lediglich Standardaufgaben, die das Team erledigt hat, um die Meetups durchzufĂŒhren. Wir haben Teile der Plattform auf eine separate Seite fĂŒr die Meetups ĂŒbertragen, um die sich Kirill Tolkatschew kĂŒmmerte.).
Um ehrlich zu sein, gab es keine gröĂeren Probleme. Nur ein paar Mal hatten wir Fehler mit dem Caching in CloudFront, die wir relativ schnell beheben konnten â wir haben einfach die Richtlinien neu konfiguriert. Die meisten Fehler traten jedoch aufgrund menschlicher Faktoren in den Streaming-Systemen auf der Plattform auf.
WĂ€hrend der Konferenzen mussten wir mehrere Exporteure schreiben, um mehr Hardware und Dienstleistungen abzudecken. Manchmal mussten wir unsere eigenen Lösungen nur fĂŒr die Metriken entwickeln. Die Welt der AV (Audio-Video) Hardware ist nicht gerade rosig â du hast irgendeine âAPIâ von GerĂ€ten, auf die du keinen Einfluss nehmen kannst. Und es ist alles andere als sicher, dass du die Informationen bekommst, die du benötigst. Hardware-Anbieter sind wirklich langsam, und es ist nahezu unmöglich, das GewĂŒnschte von ihnen zu bekommen. Insgesamt ĂŒber 100 GerĂ€te, sie liefern nicht, was du brauchst, und du schreibst seltsame und ĂŒberflĂŒssige Exporteure, mit denen man das System zumindest irgendwie debuggen kann.
AusrĂŒstung
â Ich erinnere mich, wie wir vor Beginn der Konferenzen teilweise weiteres Equipment angeschafft haben.
Artyom: Wir haben Computer, Laptops und Akkublock-Einheiten gekauft. Momentan können wir 40 Minuten ohne Strom ĂŒberbrĂŒcken. Im Juni gab es starke Gewitter in St. Petersburg â so hatten wir tatsĂ€chlich einen Stromausfall. Gleichzeitig kommen mehrere Anbieter mit Glasfaserverbindungen aus verschiedenen Punkten zu uns. Das waren wirklich 40 Minuten Downtime des GebĂ€udes, wĂ€hrenddessen das Licht brennt, der Ton und die Kameras funktionieren usw.
â Mit dem Internet haben wir eine Ă€hnliche Geschichte. Im BĂŒro, in dem sich unsere Studios befinden, haben wir eine robuste Netzwerkverbindung zwischen den Etagen gezogen.
Artyom: Wir haben 20 GBit Glasfaser zwischen den Etagen. Auf den Etagen haben wir teilweise Glasfaser, teilweise nicht, aber es gibt auf jeden Fall weniger als Gigabit-Verbindungen â wir nutzen diese, um zwischen den Tracks der Konferenz Videos zu ĂŒbertragen. Es ist sehr praktisch, mit unserer eigenen Infrastruktur zu arbeiten; bei Offline-Konferenzen gelingt das so selten.
â Noch bevor ich bei der JUG Ru Group arbeitete, sah ich, wie ĂŒber Nacht Hardware fĂŒr Offline-Konferenzen aufgestellt wird, wo ein groĂer Monitor mit allen Metriken, die Sie in Grafana visualisieren, zu sehen ist. Jetzt haben wir auch einen Hauptsitz, in dem das Entwicklungsteam sitzt, das wĂ€hrend der Konferenz Bugs behebt und neue Features entwickelt. Zudem gibt es ein Ăberwachungssystem, das auf einen groĂen Bildschirm projiziert wird. Artem, Kolya und andere Kollegen sitzen und passen darauf auf, dass alles stabil lĂ€uft und gut funktioniert.
KuriositÀten und Probleme
â Sie haben gut erklĂ€rt, dass wir Streaming mit Amazon haben, es gibt einen Web-Player, alles ist in verschiedenen Programmiersprachen geschrieben, es wird Redundanz gewĂ€hrleistet und andere geschĂ€ftliche Anforderungen werden erfĂŒllt. Zudem gibt es ein Kundenportal, das fĂŒr juristische und natĂŒrliche Personen unterstĂŒtzt wird, und wir können uns ĂŒber OAuth 2.0 integrieren. Es gibt Anti-Fraud-MaĂnahmen und Benutzersperrungen. Wir können Ănderungen dynamisch ausrollen, weil wir das gut gemacht haben, und gleichzeitig wird alles getestet.
Ich wĂŒrde gern mehr darĂŒber erfahren, welche KuriositĂ€ten auftraten, als etwas gestartet werden sollte. Gab es seltsame Situationen, als Sie das Backend oder Frontend entwickelt haben, und es kam zu einem Chaos, bei dem Sie nicht wussten, was zu tun ist?
Wladimir: Ich glaube, das passierte nur in den letzten drei Monaten. Jeden Tag. Wie Sie sehen können, sind mir alle Haare ausgegangen.

Wladimir Krasilshchik nach 3 Monaten, in denen es zu einem Chaos kam und niemand wusste, was zu tun ist.
Jeden Tag gab es solche Momente, in denen man sich die Haare raufen oder erkennen musste, dass man allein ist und niemand sonst helfen kann. Unser erstes groĂes Event war TechTrain. Am 6. Juni um 2 Uhr morgens war unsere Produktionsumgebung noch nicht eingerichtet, das machte Kolya. Und das Benutzerkonto funktionierte nicht, genauso wenig wie der Authentifizierungsserver ĂŒber OAuth 2.0. Wir verwandelten es in einen OAuth 2.0-Anbieter, um es mit der Plattform zu verbinden. Ich arbeitete wahrscheinlich bereits 18 Stunden am StĂŒck, starrte auf den Bildschirm und sah nichts, verstand nicht, warum es nicht funktionierte, wĂ€hrend Kolya aus der Ferne meinen Code ĂŒberprĂŒfte, nach einem Bug in der Spring-Konfiguration suchte, ihn fand, und das Benutzerkonto auch in der Produktion funktionierte.
Nikolaj: Eine Stunde vor dem Release fand TechTrain statt.
Hier haben sich viele Sterne zusammengefĂŒgt. Wir hatten extrem viel GlĂŒck, denn wir hatten einfach ein groĂartiges Team, und alle waren von der Idee begeistert, online zu gehen. Die ganze Zeit ĂŒber, in diesen drei Monaten, lieĂ uns der Gedanke, dass wir âYouTube machenâ, nicht los. Ich erlaubte mir nicht, die Haare zu raufen, sondern sagte allen, dass alles klappen wĂŒrde, denn tatsĂ€chlich war alles schon lange durchdacht.
Zur Leistung
â Können Sie sagen, wie viele Personen maximal gleichzeitig auf der Website waren? Gab es Leistungsprobleme?
Nikolaj: Leistungsprobleme, wie bereits erwÀhnt, gab es keine. Die maximale Anzahl an Personen, die an einem Vortrag teilgenommen haben, waren 1300, und das war bei Heisenbug.
â Gab es Probleme mit der lokalen Vorschau? Und ist es möglich, eine technische Beschreibung mit Diagrammen zu erstellen, wie das alles funktioniert?
Nikolaj: Wir werden spĂ€ter einen Artikel darĂŒber schreiben.
Es ist sogar möglich, Streams lokal zu debuggen. Sobald die Konferenzen begannen, wurde es sogar einfacher, da es Produktions-Streams gab, die wir stÀndig ansehen konnten.
Wladimir: Wie ich verstehe, haben Frontend-Entwickler lokal mit Mockups gearbeitet, und da die Deploy-Zeit fĂŒr den Frontend-Dev auch nicht lange ist (5 Minuten), gibt es keine Probleme mit den Zertifikaten.
â Alles wird getestet, debugged, sogar lokal. Also werden wir einen Artikel mit allen technischen Details schreiben, zeigen und alles mit Diagrammen erklĂ€ren, wie es gemacht wurde.
Wladimir: Sie werden es ĂŒbernehmen und wiederholen können.
â In 3 Monaten.
Zusammenfassung
â Alles, was beschrieben wurde, klingt groĂartig, wenn man bedenkt, dass es von einem kleinen Team in drei Monaten umgesetzt wurde.
Nikolaj: Ein groĂes Team hĂ€tte das nicht geschafft. Aber eine kleine Gruppe von Menschen, die eng und gut miteinander kommunizieren und sich einigen können, könnte es tun. Sie haben keine WidersprĂŒche, die Architektur wurde in zwei Tagen entworfen, finalisiert und hat sich im Wesentlichen nicht verĂ€ndert. Es gibt eine sehr strenge Strukturierung der eingehenden GeschĂ€ftsanforderungen in Bezug auf das AnhĂ€ufen von Funktionsanfragen und Ănderungen.
â Was stand auf Ihrer Liste der nĂ€chsten Aufgaben, nachdem die Sommerkonferenzen bereits stattgefunden haben?
Nikolaj: Zum Beispiel die Untertitel. Laufende Texte im Video, Pop-ups an bestimmten Stellen des Videos, abhĂ€ngig vom gezeigten Inhalt. Wenn der Redner beispielsweise eine Frage an das Publikum stellen möchte, erscheint eine Umfrage auf dem Bildschirm, die anschlieĂend an ihn zurĂŒckgesendet wird, basierend auf den Ergebnissen der Abstimmung. Eine Art soziale AktivitĂ€t in Form von Likes, Herzchen und Bewertungen wĂ€hrend der PrĂ€sentation selbst, sodass man in der richtigen Sekunde Feedback geben kann, ohne spĂ€ter auf RĂŒckmeldeformulare abzulenken. So dachte ich ursprĂŒnglich.
ZusĂ€tzlich zu der gesamten Plattform, abgesehen von Streaming und Konferenzen, gibt es auch den Zustand nach der Konferenz. Dazu gehören Playlists (einschlieĂlich benutzerdefinierter), möglicherweise Inhalte von ĂŒber vergangenen Konferenzen, integriert, markiert und fĂŒr die Benutzer zugĂ€nglich sowie auf unserer Website sichtbar.).
â Vielen Dank fĂŒr eure Antworten!
Falls unter den Lesern jemand auf unseren Sommerkonferenzen war â teilt eure EindrĂŒcke vom Player und der Ăbertragung. Was war angenehm, was hat genervt, was wĂŒnscht ihr euch fĂŒr die Zukunft?
Wenn die Plattform euer Interesse geweckt hat und ihr sie "in Aktion" sehen wollt â wir setzen sie wieder ein bei unseren . Es gibt eine ganze Reihe davon, sodass sicher eine passende fĂŒr euch dabei ist.
Quelle: habr.com
