{"id":92595,"date":"2020-08-29T07:42:06","date_gmt":"2020-08-29T05:42:06","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/razrabotat-videoplatformu-za-90-dnej"},"modified":"2020-08-29T07:42:06","modified_gmt":"2020-08-29T05:42:06","slug":"razrabotat-videoplatformu-za-90-dnej","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/razrabotat-videoplatformu-za-90-dnej","title":{"rendered":"Entwickeln Sie eine Videoplattform innerhalb von 90 Tagen.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>In diesem Fr\u00fchjahr 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\u00fcgten uns die verf\u00fcgbaren Softwarel\u00f6sungen nicht, wir mussten unsere eigene schreiben. Und daf\u00fcr hatten wir drei Monate Zeit.<\/p>\n<p><\/p>\n<p>Es ist offensichtlich, dass dies spannende drei Monate waren. Aber von au\u00dfen ist es nicht ganz klar: Was genau ist eigentlich eine Plattform f\u00fcr 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\u00fcr diese Aufgabe verantwortlich waren:<\/p>\n<p><\/p>\n<ul>\n<li>Nikolai Moltschanov \u2014 Technischer Direktor der JUG Ru Group; <\/li>\n<li>Wladimir Krasilschik \u2014 pragmatischer Java-Programmierer, der sich mit Backend besch\u00e4ftigt (Sie haben vielleicht auch seine Vortr\u00e4ge auf unseren Java-Konferenzen gesehen);<\/li>\n<li>Artem Nikonych \u2014 verantwortlich f\u00fcr unseren gesamten Videostreaming.<\/li>\n<\/ul>\n<p><\/p>\n<p>\u00dcbrigens werden wir bei den Herbst-Winter-Konferenzen eine verbesserte Version derselben Plattform verwenden \u2014 viele Hubschreiber werden also ebenfalls Nutzer sein.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Entwickeln Sie eine Videoplattform innerhalb von 90 Tagen.\" src=\"\/wp-content\/uploads\/2020\/08\/3d9f65911fa12310efff215a4ba0f2bc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"obschaya-kartina\">Gesamtbild<\/h1>\n<p><\/p>\n<p>\u2014 Wie war die Zusammensetzung des Teams?<\/p>\n<p><\/p>\n<p><b>Nikolai Moltschanov:<\/b> Wir haben einen Analysten, einen Designer, einen Tester, drei Frontend-Entwickler und einen Backend-Entwickler. Und nat\u00fcrlich einen T-shaped Spezialisten!<\/p>\n<p><\/p>\n<p>\u2014 Wie sah der Prozess insgesamt aus?<\/p>\n<p><\/p>\n<p><b>Nikolaj:<\/b> Bis Mitte M\u00e4rz waren wir f\u00fcr den Online-Betrieb \u00fcberhaupt nicht bereit. Am 15. M\u00e4rz begann dann das gesamte Online-Gesch\u00e4ft. Wir haben einige Repositories angelegt, die grundlegende Architektur geplant, diskutiert und alles innerhalb von drei Monaten umgesetzt. <\/p>\n<p><\/p>\n<p>Nat\u00fcrlich durchliefen wir die klassischen Phasen: Planung, Architektur, Auswahl der Funktionen, Abstimmung \u00fcber diese Funktionen, deren Richtlinien, Design, Entwicklung und Tests. Am 6. Juni haben wir alles live geschaltet auf <noindex><a rel=\"nofollow\" href=\"https:\/\/techtrain.ru\/\">TechTrain<\/a><\/noindex>. Daf\u00fcr hatten wir insgesamt 90 Tage.<\/p>\n<p><\/p>\n<p>\u2014 Haben wir es geschafft, das zu erreichen, was wir uns vorgenommen hatten?<\/p>\n<p><\/p>\n<p><b>Nikolaj:<\/b> Da wir jetzt online an der DevOops-Konferenz teilnehmen \u2014 haben wir es geschafft. Ich habe mich pers\u00f6nlich verpflichtet, den Kunden ein Tool zur Verf\u00fcgung zu stellen, mit dem sie eine Konferenz online durchf\u00fchren k\u00f6nnen. <\/p>\n<p><\/p>\n<p>Die Aufgabe lautete: Geben Sie uns ein Werkzeug, mit dem wir unsere Konferenzen an die Ticketinhaber \u00fcbertragen k\u00f6nnen.<\/p>\n<p><\/p>\n<p>Die gesamte Planung war in mehrere Phasen unterteilt, und alle Funktionen (etwa 30 globale) wurden in 4 Kategorien eingeteilt:<\/p>\n<p><\/p>\n<ul>\n<li>die wir unbedingt machen werden (ohne sie k\u00f6nnen wir nicht leben), <\/li>\n<li>die wir als n\u00e4chstes angehen werden, <\/li>\n<li>die wir niemals machen werden, <\/li>\n<li>und die wir niemals, niemals machen werden. <\/li>\n<\/ul>\n<p><\/p>\n<p>Alle Funktionen aus den ersten beiden Kategorien haben wir umgesetzt. <\/p>\n<p><\/p>\n<p>\u2014 Ich wei\u00df, 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\u00fcgbarkeitszonen eingerichtet und 5 RTMP-Streams in Amazon bereitgestellt.<\/p>\n<p><\/p>\n<p>Lassen Sie uns nun jede Komponente des Systems einzeln betrachten.<\/p>\n<p><\/p>\n<h1 id=\"striming\">Streaming<\/h1>\n<p><\/p>\n<p>\u2014 Fangen wir damit an, wenn wir bereits ein Video-Bild haben, das an verschiedene Dienste \u00fcbermittelt wird. Artyom, erz\u00e4hl uns, wie dieses Streaming abl\u00e4uft?<\/p>\n<p><\/p>\n<p><b>Artyom Nik\u043e\u043d\u043e\u0432:<\/b> Das Gesamtschema sieht so aus: Kamera -&gt; unser Steuerpult -&gt; lokaler RTMP-Server -&gt; Amazon -&gt; Videoplayer. Mehr dazu <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/jugru\/blog\/505138\/\">haben wir dar\u00fcber<\/a><\/noindex> auf Habr\u00e9 im Juni geschrieben.<\/p>\n<p><\/p>\n<p>Es gibt grunds\u00e4tzlich zwei globale Ans\u00e4tze, wie man das machen kann: entweder mit Hardware oder auf Basis von Softwarel\u00f6sungen. Wir haben uns f\u00fcr den Weg der Software entschieden, da dies bei entfernten Sprecherinnen und Sprechern einfacher ist. Nicht immer ist es m\u00f6glich, ein Ger\u00e4t zu einem Sprecher im Ausland zu bringen, w\u00e4hrend die Installation von Software f\u00fcr den Sprecher einfacher und zuverl\u00e4ssiger erscheint. <\/p>\n<p><\/p>\n<p>Im Hinblick auf die Hardware verf\u00fcgen wir \u00fcber eine bestimmte Anzahl von Kameras (in unseren Studios und bei entfernten Sprechern) sowie \u00fcber eine Reihe von Regiepulten im Studio, die manchmal w\u00e4hrend des Live-Streams direkt unter dem Tisch repariert werden m\u00fcssen.<\/p>\n<p><\/p>\n<p>Die Signale von diesen Ger\u00e4ten gelangen in Computer mit Capture-, Ein- und Ausgangskarten sowie Soundkarten. Dort werden die Signale gemischt und in Layouts zusammengestellt:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Entwickeln Sie eine Videoplattform innerhalb von 90 Tagen.\" src=\"\/wp-content\/uploads\/2020\/08\/6657d95080f2263d4ea17b85d57d5919.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Beispiel eines Layouts mit 4 Sprechern<\/i><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Entwickeln Sie eine Videoplattform innerhalb von 90 Tagen.\" src=\"\/wp-content\/uploads\/2020\/08\/ac3565b1b5a0f8356e20821b95037c2d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Beispiel eines Layouts mit 4 Sprechern<\/i><\/p>\n<p><\/p>\n<p>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 \u2014 die Pause, dann der erste \u2014 den n\u00e4chsten Vortrag, der zweite \u2014 die n\u00e4chste Pause und so weiter. Der Hauptcomputer mischt den ersten mit dem zweiten.<\/p>\n<p><\/p>\n<p>So entsteht eine Art Dreieck, und im Falle eines Ausfalls eines dieser Knoten k\u00f6nnen wir schnell und ohne Qualit\u00e4tsverlust 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. <\/p>\n<p><\/p>\n<p>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\u00f6me an einen Teil unseres Systems gesendet, der auf den SaaS-Diensten von Amazon basiert. Wir nutzen <noindex><a rel=\"nofollow\" href=\"https:\/\/aws.amazon.com\/ru\/medialive\/\">MediaLive<\/a><\/noindex>, S3, CloudFront. <\/p>\n<p><\/p>\n<p><b>Nikolaj:<\/b> Was passiert, bevor die Videos zu den Zuschauern gelangen? Ihr m\u00fcsst es doch irgendwie schneiden?<\/p>\n<p><\/p>\n<p><b>Artyom:<\/b> 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\u00f6sungen, damit die Leute es auf ihren Handys, \u00fcber eine schlechte Internetverbindung im Ferienhaus usw. anschauen k\u00f6nnen. Dann werden diese Streams in <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Chunk_(information)\">Chunks<\/a><\/noindex>zerteilt, so funktioniert das Protokoll <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/HTTP_Live_Streaming\">HLS.<\/a><\/noindex>. Im Frontend geben wir eine Playlist aus, die auf diese Chunks verweist.<\/p>\n<p><\/p>\n<p>\u2014 Verwenden wir eine Aufl\u00f6sung von 1080p?<\/p>\n<p><\/p>\n<p><b>Artyom:<\/b> In der Breite entspricht unser 1080p-Video 1920 Pixeln, aber in der H\u00f6he ist es etwas weniger, das Bild ist l\u00e4nger gestreckt \u2014 daf\u00fcr gibt es spezielle Gr\u00fcnde.<\/p>\n<p><\/p>\n<h1 id=\"pleer\">Player<\/h1>\n<p><\/p>\n<p>\u2014 Artyom hat beschrieben, wie das Video in die Streams gelangt, wie es auf verschiedene Playlists f\u00fcr unterschiedliche Bildschirmaufl\u00f6sungen verteilt und in Chunks unterteilt wird, bevor es im Player angezeigt wird. Kolya, erz\u00e4hl jetzt, was dieser Player ist, wie er den Stream verarbeitet und warum HLS?<\/p>\n<p><\/p>\n<p><b>Nikolaj:<\/b> Wir haben einen Player, den alle Teilnehmer der Konferenz beobachten. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Entwickeln Sie eine Videoplattform innerhalb von 90 Tagen.\" src=\"\/wp-content\/uploads\/2020\/08\/dae747f03795382deb0977d54dfa7561.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Im Grunde ist es eine Wrapper-Bibliothek <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/video-dev\/hls.js\">hls.js<\/a><\/noindex>, auf der viele andere Player basieren. Aber wir ben\u00f6tigten eine sehr spezifische Funktionalit\u00e4t: die M\u00f6glichkeit, zur\u00fcckzuspulen und zu markieren, an welcher Stelle sich die Person befindet, welcher Vortrag sie sich gerade ansieht. Au\u00dferdem brauchten wir eigene Layouts, Logos und alles andere, was wir integriert haben. Daher haben wir beschlossen, unsere eigene Bibliothek (eine Wrapper \u00fcber HLS) zu erstellen und dies in die Website zu integrieren. <\/p>\n<p><\/p>\n<p>Das ist die grundlegende Funktionalit\u00e4t, die daher fast als erste umgesetzt wurde. Darum herum hat sich dann alles andere entwickelt. <\/p>\n<p><\/p>\n<p>Tats\u00e4chlich erh\u00e4lt der Player \u00fcber die Authentifizierung vom Backend eine Playlist mit Links zu den Chunks, die mit Zeit und Qualit\u00e4t verkn\u00fcpft sind, l\u00e4dt die ben\u00f6tigten herunter und zeigt sie dem Benutzer an, w\u00e4hrend er dabei eine gewisse \"Magie\" entfaltet.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Entwickeln Sie eine Videoplattform innerhalb von 90 Tagen.\" src=\"\/wp-content\/uploads\/2020\/08\/e20335b062f38ccf05af41a4324ff4fb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Beispiel eines Zeitplans<\/i><\/p>\n<p><\/p>\n<p>\u2014 Direkt im Player ist ein Button integriert, um den Zeitplan aller Vortr\u00e4ge anzuzeigen\u2026<\/p>\n<p><\/p>\n<p><b>Nikolaj:<\/b> 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\u00f6nnen Inhaber eines Full Pass-Tickets frei zwischen verschiedenen Konferenzen wechseln: sowohl dem Live-Stream als auch den Aufzeichnungen vergangener Veranstaltungen. <\/p>\n<p><\/p>\n<p>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\u00fcr die Vortr\u00e4ge erstellt, um zwischen Tracks und Vortr\u00e4gen zu wechseln. Dort gibt es Steuerungsoptionen von der Tastatur.<\/p>\n<p><\/p>\n<p>\u2014 Gab es technische Schwierigkeiten dabei?<\/p>\n<p><\/p>\n<p><b>Nikolaj:<\/b> Es gab Probleme mit der Scroll-Leiste, auf der die Anfangspunkte der verschiedenen Vortr\u00e4ge markiert sind. <\/p>\n<p><\/p>\n<p>\u2014 Habt ihr diese Markierungen auf der Scroll-Leiste umgesetzt, bevor YouTube etwas \u00c4hnliches gemacht hat?<\/p>\n<p><\/p>\n<p><b>Artyom:<\/b> 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. <\/p>\n<p><\/p>\n<p><b>Nikolaj:<\/b> Wir haben das tats\u00e4chlich 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.<\/p>\n<p><\/p>\n<h1 id=\"frontend\">Frontend<\/h1>\n<p><\/p>\n<p>Lassen Sie uns kl\u00e4ren, wie die Inhalte, die wir anzeigen (Berichtskarte, Sprecher, Website, Zeitplan), ins Frontend gelangen?<\/p>\n<p><\/p>\n<p><b>Wladimir Krasyllschik:<\/b> 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. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Entwickeln Sie eine Videoplattform innerhalb von 90 Tagen.\" src=\"\/wp-content\/uploads\/2020\/08\/309559ba100f9b5e2195c7720b82f62d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>So sieht der Sprecher die Pipeline.<\/i><\/p>\n<p><\/p>\n<p>Dieses System ist unsere interne Entwicklung. <\/p>\n<p><\/p>\n<p>Aus den einzelnen Berichten muss ein Zeitplan erstellt werden. Wie bekannt ist, handelt es sich dabei um ein NP-schweres Problem, aber wir l\u00f6sen 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 \u2013 Pr\u00e4sentationen, Pausen oder Sponsoraktivit\u00e4ten \u2013 enth\u00e4lt. Der Inhalt, den wir sehen, befindet sich also in einem externen Dienst. Unsere Aufgabe ist es, diesen Inhalt auf die Website zu bringen. <\/p>\n<p><\/p>\n<p>Auf den ersten Blick scheint die Website lediglich eine Seite mit einem Player zu sein, und es ist nichts dabei. Au\u00dfer, 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. \u00dcber eine Websocket-Verbindung, die jeder Kunde unserer Plattform herstellt, senden wir aktualisierte Informationen zum Zeitplan vom Backend direkt an das Frontend. <\/p>\n<p><\/p>\n<p>Echter Fall: Der Sprecher hat w\u00e4hrend der Konferenz den Job gewechselt. Wir m\u00fcssen ihm das Firmen-Label anpassen. Wie geschieht das im Backend? \u00dcber Websockets wird eine Aktualisierung an alle Clients gesendet, und dann aktualisiert das Frontend selbstst\u00e4ndig die Timeline. Dieser Prozess l\u00e4uft nahtlos ab. Die Kombination aus unserem Cloud-Service und mehreren Komponenten erm\u00f6glicht es uns, all diese Inhalte zu erstellen und dem Frontend zur Verf\u00fcgung zu stellen. <\/p>\n<p><\/p>\n<p><b>Nikolaj:<\/b> Hier ist es wichtig zu kl\u00e4ren, dass unsere Website nicht nur eine klassische SPA-Anwendung ist. Es ist sowohl eine gerenderte als auch eine gebaute Website. Tats\u00e4chlich sieht Google diese Seite als gerendertes HTML. Das ist gut f\u00fcr SEO und f\u00fcr 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\u00fcren das jedes Mal, wenn Sie zwischen den Pr\u00e4sentationen wechseln. Alles geschieht in einer halben Sekunde, da die Inhalte bereits bereitgestellt und am richtigen Ort abgelegt sind.<\/p>\n<p><\/p>\n<p>\u2014 Lassen Sie uns die oben genannten Punkte zusammenfassen, indem wir die Technologien auflisten. T\u0451ma hat erkl\u00e4rt, dass wir 5 Amazon-Streams haben, \u00fcber die wir Video und Audio liefern. Dort verwenden wir Bash-Skripte, um sie zu starten und zu konfigurieren...<\/p>\n<p><\/p>\n<p><b>Artyom:<\/b> Das erfolgt \u00fcber die AWS-API, wo es noch viele andere technische Begleitdienste gibt. Wir haben unsere Aufgaben so aufgeteilt, dass ich Inhalte aufliefern kann an <noindex><a rel=\"nofollow\" href=\"https:\/\/aws.amazon.com\/ru\/cloudfront\/\">CloudFront<\/a><\/noindex>, w\u00e4hrend Frontend- und Backend-Entwickler diese abholen. Wir verf\u00fcgen \u00fcber einige eigene Anbindungen zur Vereinfachung der Bereitstellung von Inhalten, die wir sp\u00e4ter in 4K erstellen usw. Aufgrund der engen Zeitvorgaben haben wir praktisch alles auf Basis von AWS realisiert.<\/p>\n<p><\/p>\n<p>\u2014 Anschlie\u00dfend gelangt alles in den Player \u00fcber 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.<\/p>\n<p><\/p>\n<p>Ich m\u00f6chte au\u00dferdem 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\u00dft, selbst im Intensivbetrieb wurde auf solche Aspekte geachtet.<\/p>\n<p><\/p>\n<h1 id=\"biznes-ogranicheniya-i-analitika\">Gesch\u00e4ftsrestriktionen und Analytik<\/h1>\n<p><\/p>\n<p>\u2014 Wir haben uns auf die gesch\u00e4ftlichen Anforderungen von 10.000 Nutzern konzentriert. Nun ist es an der Zeit, \u00fcber die gesch\u00e4ftlichen Einschr\u00e4nkungen zu sprechen, mit denen wir konfrontiert waren. Wir mussten eine hohe Last garantieren und die Einhaltung des Datenschutzgesetzes sicherstellen. Was gab es noch?<\/p>\n<p><\/p>\n<p><b>Nikolaj:<\/b> Urspr\u00fcnglich basierten wir auf den Anforderungen an das Video. Das Wichtigste war die verteilte Speicherung von Videos weltweit f\u00fcr eine schnelle Bereitstellung an den Kunden. Weitere Anforderungen waren eine 1080p Aufl\u00f6sung und die M\u00f6glichkeit, zur\u00fcckzuspulen, was viele andere Anbieter im Live-Modus nicht implementiert haben. Sp\u00e4ter f\u00fcgten wir die Funktion hinzu, die Wiedergabegeschwindigkeit auf 2x zu erh\u00f6hen, mit der man \"aufschlie\u00dfen\" und die Konferenz in Echtzeit weiterverfolgen kann. Au\u00dferdem entwickelte sich w\u00e4hrenddessen eine Funktionalit\u00e4t zur Zeitachsenmarkierung. Dar\u00fcber hinaus mussten wir ausfallsicher sein und eine Last von 10.000 Verbindungen bew\u00e4ltigen. 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.<\/p>\n<p><\/p>\n<p>\u2014 Gab es auch Anforderungen an eine \"virtuelle Ausstellung\" mit Online-St\u00e4nden der Partner?<\/p>\n<p><\/p>\n<p><b>Nikolaj:<\/b> Ja, das musste ziemlich schnell und universell erledigt werden. Wir hatten bis zu 10 Partnerunternehmen f\u00fcr 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. <\/p>\n<p><\/p>\n<p>\u2014 Es gab auch Anforderungen an die Echtzeit-Analyse der Ansichten und Statistiken. Ich wei\u00df, dass wir daf\u00fcr Prometheus verwenden. K\u00f6nnen Sie genauer erz\u00e4hlen, welche Anforderungen wir in Bezug auf die Analyse erf\u00fcllen und wie dies umgesetzt wird?<\/p>\n<p><\/p>\n<p><b>Nikolaj:<\/b> Urspr\u00fcnglich hatten wir marketingtechnische Anforderungen an die Datenerhebung f\u00fcr A\/B-Tests und zur Informationssammlung, um zu verstehen, wie wir dem Kunden zuk\u00fcnftig die besten Inhalte liefern k\u00f6nnen. Es gibt auch Anforderungen f\u00fcr bestimmte Analysen zu Partneraktivit\u00e4ten und die Analysen, die Sie sehen (Besucherz\u00e4hler). Alle Informationen werden in Echtzeit gesammelt. <\/p>\n<p><\/p>\n<p>Diese Informationen k\u00f6nnen 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\u00f6nlichen Daten und der Zugang zum pers\u00f6nlichen Bereich nicht verfolgt. <\/p>\n<p><\/p>\n<p>Die Plattform verf\u00fcgt bereits \u00fcber Marketinginstrumente sowie unsere Metriken zur Messung der Benutzeraktivit\u00e4t in Echtzeit (wer zu welchem Zeitpunkt die Pr\u00e4sentation angesehen hat), um Besuchsgrafiken zu erstellen. Diese Daten werden f\u00fcr Forschungen genutzt, die helfen, zuk\u00fcnftige Konferenzen zu verbessern. <\/p>\n<p><\/p>\n<h1 id=\"frod\">Betrug<\/h1>\n<p><\/p>\n<p>\u2014 Haben wir Anti-Betrugs-Mechanismen?<\/p>\n<p><\/p>\n<p><b>Nikolaj:<\/b> Aufgrund der strengen zeitlichen Vorgaben wurde von Anfang an nicht die Strategie verfolgt, unn\u00f6tige 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\u00e4ckige \u00dcbelt\u00e4ter wurden gesperrt. <\/p>\n<p><\/p>\n<p><b>Wladimir:<\/b> Man muss sagen, einer der gesperrten Benutzer hat verstanden, warum das passiert ist. Er kam, entschuldigte sich und versprach, ein Ticket zu kaufen.<\/p>\n<p><\/p>\n<p>\u2014 Damit dies alles funktioniert, m\u00fcssen Sie alle Nutzer vom Eintritt bis zum Austritt vollst\u00e4ndig nachverfolgen und immer wissen, was sie tun. Wie funktioniert dieses System?<\/p>\n<p><\/p>\n<p><b>Wladimir:<\/b> Ich m\u00f6chte \u00fcber die Analytik und die Statistiken sprechen, die wir dann analysieren, um den Erfolg des Vortrags zu bewerten oder die wir sp\u00e4ter unseren Partnern bereitstellen k\u00f6nnen. Alle Kunden sind \u00fcber eine WebSocket-Verbindung mit einem bestimmten Backend-Cluster verbunden. Dort steht <noindex><a rel=\"nofollow\" href=\"https:\/\/hazelcast.com\/\">Hazelcast<\/a><\/noindex>. Jeder Kunde sendet in regelm\u00e4\u00dfigen Abst\u00e4nden Informationen dar\u00fcber, was er tut und welchen Track er sich ansieht. Diese Informationen werden dann z\u00fcgig durch Hazelcast-Jobs aggregiert und an alle zur\u00fcckgesendet, die diese Tracks gerade ansehen. Wir sehen in der Ecke, wie viele Menschen gerade mit uns zusammen sind. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Entwickeln Sie eine Videoplattform innerhalb von 90 Tagen.\" src=\"\/wp-content\/uploads\/2020\/08\/fa08d10412cbdab418914183f25efa3b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Diese Informationen werden auch in <noindex><a rel=\"nofollow\" href=\"https:\/\/www.mongodb.com\/\">Mongo<\/a><\/noindex> gespeichert und wandern in unser Datenspeicher, aus dem wir interessantere Diagramme erstellen k\u00f6nnen. Es stellt sich die Frage: Wie viele einzigartige Nutzer haben diesen Vortrag gesehen? Wir gehen zu <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/\">Postgres<\/a><\/noindex>, wo die Pings aller Personen, die \u00fcber die ID dieses Vortrags gekommen sind, gesammelt werden. Wir aggregieren die einzigartigen Nutzer und k\u00f6nnen jetzt verstehen.<\/p>\n<p><\/p>\n<p><b>Nikolaj:<\/b> 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\u00f6nnen wir in Echtzeit beliebige Diagramme erstellen.<\/p>\n<p><\/p>\n<p><b>Wladimir:<\/b> Einerseits laden wir das f\u00fcr die weitere Verarbeitung im OLAP-Stil hoch. Das OLTP-Anwendungssystem l\u00e4dt all dies in Prometheus, Grafana, und die Diagramme stimmen sogar \u00fcberein! <\/p>\n<p><\/p>\n<p>\u2014 Das ist der Fall, bei dem die Diagramme \u00fcbereinstimmen.<\/p>\n<p><\/p>\n<h1 id=\"dinamicheskie-izmeneniya\">Dynamische \u00c4nderungen<\/h1>\n<p><\/p>\n<p>\u2014 Erz\u00e4hlen Sie, wie dynamische \u00c4nderungen ausgerollt werden: Wenn ein Vortrag 6 Minuten vor Beginn abgesagt wird, welche Handlungsfolge gibt es? Welcher Pipeline wird aktiviert?<\/p>\n<p><\/p>\n<p><b>Wladimir:<\/b> Die Pipeline ist sehr bedingt. Es gibt mehrere M\u00f6glichkeiten. Die erste ist, dass das Programm zur Planung des Zeitplans aktiviert wird und diesen \u00e4ndert. Der ge\u00e4nderte Zeitplan wird in Contentful hochgeladen. Danach versteht das Backend, dass es \u00c4nderungen zu dieser Konferenz in Contentful gibt, \u00fcbernimmt das und baut neu auf. Alles wird zusammengestellt und \u00fcber Websocket gesendet. <\/p>\n<p><\/p>\n<p>Die zweite M\u00f6glichkeit ist, wenn alles ganz schnell abl\u00e4uft: Der Redakteur \u00e4ndert die Informationen in Contentful manuell (den Link zu Telegram, die Pr\u00e4sentation des Referenten usw.) und dieselbe Logik wird aktiviert wie beim ersten Mal. <\/p>\n<p><\/p>\n<p><b>Nikolaj:<\/b> Alles geschieht ohne ein Neuladen der Seite. Alle \u00c4nderungen erfolgen nahtlos f\u00fcr den Kunden. Das gilt auch f\u00fcr den Wechsel der Vortr\u00e4ge. Wenn die Zeit gekommen ist, \u00e4ndert sich der Vortrag und das Interface. <\/p>\n<p><\/p>\n<p><b>Wladimir:<\/b> Ebenso die Zeitmarken f\u00fcr den Beginn der Vortr\u00e4ge in der Timeline. Am Anfang ist nichts vorhanden. Wenn man mit der Maus \u00fcber den roten Balken f\u00e4hrt, erscheinen zu einem bestimmten Zeitpunkt, dank des Regisseurs der \u00dcbertragung, die Zeitmarken. Der Regisseur setzt den richtigen Beginn der \u00dcbertragung, das Backend erfasst diese \u00c4nderung, berechnet entsprechend dem Zeitplan der Konferenz die Start- und Endzeit der Vortr\u00e4ge 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\u00e4ftsanforderung, sehr praktisch und n\u00fctzlich. Man spart Zeit, um den genauen Beginn des Vortrags zu finden. Wenn wir die Vorschau erstellen, wird es wirklich gro\u00dfartig sein.<\/p>\n<p><\/p>\n<h1 id=\"deployment\">Deployment<\/h1>\n<p><\/p>\n<p>\u2014 Ich w\u00fcrde 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\u00e4hl mir, aus welchen Komponenten besteht das alles?<\/p>\n<p><\/p>\n<p><b>Nikolaj:<\/b> Zu Beginn hatten wir die Anforderung, das Produkt technisch so weit wie m\u00f6glich von einem bestimmten Anbieter zu abstrahieren. Es passte nicht wirklich, spezifische Terraform-Skripte f\u00fcr AWS, Yandex oder Azure zu erstellen. Wir mussten damals woanders hinziehen. <\/p>\n<p><\/p>\n<p>In den ersten drei Wochen suchten wir st\u00e4ndig einen Weg, wie wir es am besten umsetzen k\u00f6nnen. Letztendlich haben wir festgestellt, dass Kubernetes in diesem Fall unsere beste L\u00f6sung ist, da es automatisch skalierbare Dienste sowie Rollouts erm\u00f6glicht und fast alle Dienste sofort verf\u00fcgbar sind. Nat\u00fcrlich mussten wir alle Dienste auf die Arbeit mit Kubernetes und Docker schulen, und das Team musste ebenfalls lernen. <\/p>\n<p><\/p>\n<p>Wir haben zwei Cluster: einen Test- und einen Produktionscluster. Diese sind hinsichtlich Hardware und Einstellungen v\u00f6llig identisch. Wir implementieren Infrastruktur als Code. Alle Dienste werden \u00fcber 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. <\/p>\n<p><\/p>\n<p>Wir k\u00f6nnen schnell \u00c4nderungen 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\u00dferdem testen wir Belastungstests, um sicherzustellen, dass wir im Produktionsumfeld das Gleiche erhalten. <\/p>\n<p><\/p>\n<h1 id=\"pro-testy\">Zu den Tests<\/h1>\n<p><\/p>\n<p>\u2014 Sie testen fast alles, es ist schwer zu glauben, wie gr\u00fcndlich Sie das umgesetzt haben. K\u00f6nnen Sie etwas \u00fcber die Tests im Backend erz\u00e4hlen: Wie umfassend ist die Abdeckung, welche Tests werden durchgef\u00fchrt?<\/p>\n<p><\/p>\n<p><b>Wladimir:<\/b> Es gibt zwei Arten von Tests. Die ersten sind Kompontententests. Tests der gesamten Spring-Anwendung und Datenbank in <noindex><a rel=\"nofollow\" href=\"https:\/\/www.testcontainers.org\/\">Testcontainers<\/a><\/noindex>. Dies pr\u00fcft die hochgradig gesch\u00e4ftskritischen Szenarien. Ich teste keine Funktionen, sondern konzentriere mich nur auf gr\u00f6\u00dfere Abl\u00e4ufe. Beispielsweise wird im Test der Login-Prozess eines Benutzers emuliert, einschlie\u00dflich der Abfrage von Tickets, die er erwerben kann, sowie des Zugriffs auf Streaming-Inhalte. Sehr nachvollziehbare Benutzer-Szenarien. <\/p>\n<p><\/p>\n<p>\u00c4hnliches wird in sogenannten Integrationstests umgesetzt, die tats\u00e4chlich in der Umgebung laufen. Wenn ein neuer Deployment in die Produktion erfolgt, werden in der Produktion auch echte Basisszenarien ausgef\u00fchrt. Das umfasst den gleichen Login, Ticketanfragen, Zugriffsanforderungen an CloudFront, sowie die \u00dcberpr\u00fcfung, ob der Stream tats\u00e4chlich mit meinen Berechtigungen verbunden ist, und die Pr\u00fcfung der Regieoberfl\u00e4che. <\/p>\n<p><\/p>\n<p>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\u00e4tten wir manuell getestet und die Funktionen an unsere Testerin \u00fcbergeben, w\u00e4hrend sie Fehler gefunden und uns zur Behebung zur\u00fcckgeschickt h\u00e4tte, w\u00e4re dieser gesamte Prozess des Code-Debuggings sehr lange gedauert und wir h\u00e4tten keine Fristen einhalten k\u00f6nnen.<\/p>\n<p><\/p>\n<p><b>Nikolaj:<\/b> Um eine Regression auf der gesamten Plattform bei einer \u00c4nderung einer Funktion durchzuf\u00fchren, m\u00fcsste man zwei Tage lang \u00fcberall herumklicken. <\/p>\n<p><\/p>\n<p><b>Wladimir:<\/b> Es ist also ein gro\u00dfer Erfolg, dass, wenn ich eine Funktion sch\u00e4tze, ich sage, dass ich 4 Tage f\u00fcr zwei einfache Features und 1 Websocket brauche, Kola zustimmt. Er ist bereits daran gew\u00f6hnt, dass in diesen 4 Tagen 2 Arten von Tests eingeplant sind und es wahrscheinlich danach funktionieren wird. <\/p>\n<p><\/p>\n<p><b>Nikolaj:<\/b> 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\u00dferdem haben wir k\u00fcrzlich grundlegende UI-Funktionstests eingef\u00fchrt. Damit decken wir die grundlegendsten Funktionen ab, die fehleranf\u00e4llig sein k\u00f6nnten. <\/p>\n<p><\/p>\n<p><b>Wladimir:<\/b> Nat\u00fcrlich sollte ich \u00fcber 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\u00e4chlich ben\u00f6tigt wird. <\/p>\n<p><\/p>\n<p>\u2014 Ich wei\u00df 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?<\/p>\n<p><\/p>\n<p><b>Artyom:<\/b> 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\u00fchren. Wir haben Teile der Plattform auf eine separate Seite f\u00fcr die Meetups \u00fcbertragen, um die sich Kirill Tolkatschew k\u00fcmmerte.<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/tolkkv\/\" class=\"user_link\">tolkkv<\/a><\/noindex>).<\/p>\n<p><\/p>\n<p>Um ehrlich zu sein, gab es keine gr\u00f6\u00dferen Probleme. Nur ein paar Mal hatten wir Fehler mit dem Caching in CloudFront, die wir relativ schnell beheben konnten \u2014 wir haben einfach die Richtlinien neu konfiguriert. Die meisten Fehler traten jedoch aufgrund menschlicher Faktoren in den Streaming-Systemen auf der Plattform auf. <\/p>\n<p><\/p>\n<p>W\u00e4hrend der Konferenzen mussten wir mehrere Exporteure schreiben, um mehr Hardware und Dienstleistungen abzudecken. Manchmal mussten wir unsere eigenen L\u00f6sungen nur f\u00fcr die Metriken entwickeln. Die Welt der AV (Audio-Video) Hardware ist nicht gerade rosig \u2014 du hast irgendeine \u201eAPI\u201c von Ger\u00e4ten, auf die du keinen Einfluss nehmen kannst. Und es ist alles andere als sicher, dass du die Informationen bekommst, die du ben\u00f6tigst. Hardware-Anbieter sind wirklich langsam, und es ist nahezu unm\u00f6glich, das Gew\u00fcnschte von ihnen zu bekommen. Insgesamt \u00fcber 100 Ger\u00e4te, sie liefern nicht, was du brauchst, und du schreibst seltsame und \u00fcberfl\u00fcssige Exporteure, mit denen man das System zumindest irgendwie debuggen kann.<\/p>\n<p><\/p>\n<h1 id=\"oborudovanie\">Ausr\u00fcstung<\/h1>\n<p><\/p>\n<p>\u2014 Ich erinnere mich, wie wir vor Beginn der Konferenzen teilweise weiteres Equipment angeschafft haben.<\/p>\n<p><\/p>\n<p><b>Artyom:<\/b> Wir haben Computer, Laptops und Akkublock-Einheiten gekauft. Momentan k\u00f6nnen wir 40 Minuten ohne Strom \u00fcberbr\u00fccken. Im Juni gab es starke Gewitter in St. Petersburg \u2014 so hatten wir tats\u00e4chlich einen Stromausfall. Gleichzeitig kommen mehrere Anbieter mit Glasfaserverbindungen aus verschiedenen Punkten zu uns. Das waren wirklich 40 Minuten Downtime des Geb\u00e4udes, w\u00e4hrenddessen das Licht brennt, der Ton und die Kameras funktionieren usw.<\/p>\n<p><\/p>\n<p>\u2014 Mit dem Internet haben wir eine \u00e4hnliche Geschichte. Im B\u00fcro, in dem sich unsere Studios befinden, haben wir eine robuste Netzwerkverbindung zwischen den Etagen gezogen.<\/p>\n<p><\/p>\n<p><b>Artyom:<\/b> 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 \u2013 wir nutzen diese, um zwischen den Tracks der Konferenz Videos zu \u00fcbertragen. Es ist sehr praktisch, mit unserer eigenen Infrastruktur zu arbeiten; bei Offline-Konferenzen gelingt das so selten. <\/p>\n<p><\/p>\n<p>\u2014 Noch bevor ich bei der JUG Ru Group arbeitete, sah ich, wie \u00fcber Nacht Hardware f\u00fcr Offline-Konferenzen aufgestellt wird, wo ein gro\u00dfer 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\u00e4hrend der Konferenz Bugs behebt und neue Features entwickelt. Zudem gibt es ein \u00dcberwachungssystem, das auf einen gro\u00dfen Bildschirm projiziert wird. Artem, Kolya und andere Kollegen sitzen und passen darauf auf, dass alles stabil l\u00e4uft und gut funktioniert.<\/p>\n<p><\/p>\n<h1 id=\"kuryozy-i-problemy\">Kuriosit\u00e4ten und Probleme<\/h1>\n<p><\/p>\n<p>\u2014 Sie haben gut erkl\u00e4rt, dass wir Streaming mit Amazon haben, es gibt einen Web-Player, alles ist in verschiedenen Programmiersprachen geschrieben, es wird Redundanz gew\u00e4hrleistet und andere gesch\u00e4ftliche Anforderungen werden erf\u00fcllt. Zudem gibt es ein Kundenportal, das f\u00fcr juristische und nat\u00fcrliche Personen unterst\u00fctzt wird, und wir k\u00f6nnen uns \u00fcber OAuth 2.0 integrieren. Es gibt Anti-Fraud-Ma\u00dfnahmen und Benutzersperrungen. Wir k\u00f6nnen \u00c4nderungen dynamisch ausrollen, weil wir das gut gemacht haben, und gleichzeitig wird alles getestet.<\/p>\n<p><\/p>\n<p>Ich w\u00fcrde gern mehr dar\u00fcber erfahren, welche Kuriosit\u00e4ten 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?<\/p>\n<p><\/p>\n<p><b>Wladimir:<\/b> Ich glaube, das passierte nur in den letzten drei Monaten. Jeden Tag. Wie Sie sehen k\u00f6nnen, sind mir alle Haare ausgegangen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Entwickeln Sie eine Videoplattform innerhalb von 90 Tagen.\" src=\"\/wp-content\/uploads\/2020\/08\/6ff16a1abd6ec5fb445d8d3888d990e7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Wladimir Krasilshchik nach 3 Monaten, in denen es zu einem Chaos kam und niemand wusste, was zu tun ist.<\/i><\/p>\n<p><\/p>\n<p>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\u00dfes 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 \u00fcber 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\u00fcck, starrte auf den Bildschirm und sah nichts, verstand nicht, warum es nicht funktionierte, w\u00e4hrend Kolya aus der Ferne meinen Code \u00fcberpr\u00fcfte, nach einem Bug in der Spring-Konfiguration suchte, ihn fand, und das Benutzerkonto auch in der Produktion funktionierte. <\/p>\n<p><\/p>\n<p><b>Nikolaj:<\/b> Eine Stunde vor dem Release fand TechTrain statt. <\/p>\n<p><\/p>\n<p>Hier haben sich viele Sterne zusammengef\u00fcgt. Wir hatten extrem viel Gl\u00fcck, denn wir hatten einfach ein gro\u00dfartiges Team, und alle waren von der Idee begeistert, online zu gehen. Die ganze Zeit \u00fcber, in diesen drei Monaten, lie\u00df uns der Gedanke, dass wir \u201eYouTube machen\u201c, nicht los. Ich erlaubte mir nicht, die Haare zu raufen, sondern sagte allen, dass alles klappen w\u00fcrde, denn tats\u00e4chlich war alles schon lange durchdacht. <\/p>\n<p><\/p>\n<h1 id=\"pro-proizvoditelnost\">Zur Leistung<\/h1>\n<p><\/p>\n<p>\u2014 K\u00f6nnen Sie sagen, wie viele Personen maximal gleichzeitig auf der Website waren? Gab es Leistungsprobleme?<\/p>\n<p><\/p>\n<p><b>Nikolaj:<\/b> Leistungsprobleme, wie bereits erw\u00e4hnt, gab es keine. Die maximale Anzahl an Personen, die an einem Vortrag teilgenommen haben, waren 1300, und das war bei Heisenbug.<\/p>\n<p><\/p>\n<p>\u2014 Gab es Probleme mit der lokalen Vorschau? Und ist es m\u00f6glich, eine technische Beschreibung mit Diagrammen zu erstellen, wie das alles funktioniert?<\/p>\n<p><\/p>\n<p><b>Nikolaj:<\/b> Wir werden sp\u00e4ter einen Artikel dar\u00fcber schreiben.<\/p>\n<p><\/p>\n<p>Es ist sogar m\u00f6glich, Streams lokal zu debuggen. Sobald die Konferenzen begannen, wurde es sogar einfacher, da es Produktions-Streams gab, die wir st\u00e4ndig ansehen konnten.<\/p>\n<p><\/p>\n<p><b>Wladimir:<\/b> Wie ich verstehe, haben Frontend-Entwickler lokal mit Mockups gearbeitet, und da die Deploy-Zeit f\u00fcr den Frontend-Dev auch nicht lange ist (5 Minuten), gibt es keine Probleme mit den Zertifikaten. <\/p>\n<p><\/p>\n<p>\u2014 Alles wird getestet, debugged, sogar lokal. Also werden wir einen Artikel mit allen technischen Details schreiben, zeigen und alles mit Diagrammen erkl\u00e4ren, wie es gemacht wurde.<\/p>\n<p><\/p>\n<p><b>Wladimir:<\/b> Sie werden es \u00fcbernehmen und wiederholen k\u00f6nnen. <\/p>\n<p><\/p>\n<p>\u2014 In 3 Monaten.<\/p>\n<p><\/p>\n<h1 id=\"itog\">Zusammenfassung<\/h1>\n<p><\/p>\n<p>\u2014 Alles, was beschrieben wurde, klingt gro\u00dfartig, wenn man bedenkt, dass es von einem kleinen Team in drei Monaten umgesetzt wurde.<\/p>\n<p><\/p>\n<p><b>Nikolaj:<\/b> Ein gro\u00dfes Team h\u00e4tte das nicht geschafft. Aber eine kleine Gruppe von Menschen, die eng und gut miteinander kommunizieren und sich einigen k\u00f6nnen, k\u00f6nnte es tun. Sie haben keine Widerspr\u00fcche, die Architektur wurde in zwei Tagen entworfen, finalisiert und hat sich im Wesentlichen nicht ver\u00e4ndert. Es gibt eine sehr strenge Strukturierung der eingehenden Gesch\u00e4ftsanforderungen in Bezug auf das Anh\u00e4ufen von Funktionsanfragen und \u00c4nderungen. <\/p>\n<p><\/p>\n<p>\u2014 Was stand auf Ihrer Liste der n\u00e4chsten Aufgaben, nachdem die Sommerkonferenzen bereits stattgefunden haben?<\/p>\n<p><\/p>\n<p><b>Nikolaj:<\/b> Zum Beispiel die Untertitel. Laufende Texte im Video, Pop-ups an bestimmten Stellen des Videos, abh\u00e4ngig vom gezeigten Inhalt. Wenn der Redner beispielsweise eine Frage an das Publikum stellen m\u00f6chte, erscheint eine Umfrage auf dem Bildschirm, die anschlie\u00dfend an ihn zur\u00fcckgesendet wird, basierend auf den Ergebnissen der Abstimmung. Eine Art soziale Aktivit\u00e4t in Form von Likes, Herzchen und Bewertungen w\u00e4hrend der Pr\u00e4sentation selbst, sodass man in der richtigen Sekunde Feedback geben kann, ohne sp\u00e4ter auf R\u00fcckmeldeformulare abzulenken. So dachte ich urspr\u00fcnglich.<\/p>\n<p><\/p>\n<p>Zus\u00e4tzlich zu der gesamten Plattform, abgesehen von Streaming und Konferenzen, gibt es auch den Zustand nach der Konferenz. Dazu geh\u00f6ren Playlists (einschlie\u00dflich benutzerdefinierter), m\u00f6glicherweise Inhalte von \u00fcber vergangenen Konferenzen, integriert, markiert und f\u00fcr die Benutzer zug\u00e4nglich sowie auf unserer Website sichtbar.<noindex><a rel=\"nofollow\" href=\"https:\/\/live.jugru.org\/?utm_source=habr&amp;utm_medium=516688\">live.jugru.org<\/a><\/noindex>). <\/p>\n<p><\/p>\n<p>\u2014 Vielen Dank f\u00fcr eure Antworten!<\/p>\n<p>Falls unter den Lesern jemand auf unseren Sommerkonferenzen war \u2014 teilt eure Eindr\u00fccke vom Player und der \u00dcbertragung. Was war angenehm, was hat genervt, was w\u00fcnscht ihr euch f\u00fcr die Zukunft?<\/p>\n<p><\/p>\n<p>Wenn die Plattform euer Interesse geweckt hat und ihr sie \"in Aktion\" sehen wollt \u2014 wir setzen sie wieder ein bei unseren <noindex><a rel=\"nofollow\" href=\"https:\/\/live.jugru.org\/?utm_source=habr&amp;utm_medium=516688\">herbst-winterlichen Konferenzen<\/a><\/noindex>. Es gibt eine ganze Reihe davon, sodass sicher eine passende f\u00fcr euch dabei ist.<\/p>\n<p>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/jugru\/blog\/516688\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u042d\u0442\u043e\u0439 \u0432\u0435\u0441\u043d\u043e\u0439 \u043c\u044b \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u0432 \u043e\u0447\u0435\u043d\u044c \u0432\u0435\u0441\u0451\u043b\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445. \u0418\u0437-\u0437\u0430 \u043f\u0430\u043d\u0434\u0435\u043c\u0438\u0438 \u0441\u0442\u0430\u043b\u043e \u044f\u0441\u043d\u043e, \u0447\u0442\u043e \u043d\u0430\u0448\u0438 \u043b\u0435\u0442\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u044c \u0432 \u043e\u043d\u043b\u0430\u0439\u043d. \u0410 \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0438\u0445 \u0432 \u043e\u043d\u043b\u0430\u0439\u043d\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043d\u0430\u043c \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u043b\u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0441\u043e\u0444\u0442\u043e\u0432\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435. \u0418 \u043d\u0430 \u044d\u0442\u043e \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b\u043e \u0442\u0440\u0438 \u043c\u0435\u0441\u044f\u0446\u0430. \u041f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u0431\u044b\u043b\u0438 \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0442\u0440\u0438 \u043c\u0435\u0441\u044f\u0446\u0430. \u041d\u043e \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043d\u0435 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":92596,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-92595","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u042d\u0442\u043e\u0439 \u0432\u0435\u0441\u043d\u043e\u0439 \u043c\u044b \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u0432 \u043e\u0447\u0435\u043d\u044c \u0432\u0435\u0441\u0451\u043b\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445. \u0418\u0437-\u0437\u0430 \u043f\u0430\u043d\u0434\u0435\u043c\u0438\u0438 \u0441\u0442\u0430\u043b\u043e \u044f\u0441\u043d\u043e, \u0447\u0442\u043e \u043d\u0430\u0448\u0438 \u043b\u0435\u0442\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u044c \u0432 \u043e\u043d\u043b\u0430\u0439\u043d. \u0410 \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0438\u0445 \u0432 \u043e\u043d\u043b\u0430\u0439\u043d\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043d\u0430\u043c \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u043b\u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0441\u043e\u0444\u0442\u043e\u0432\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435. \u0418 \u043d\u0430 \u044d\u0442\u043e \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b\u043e \u0442\u0440\u0438 \u043c\u0435\u0441\u044f\u0446\u0430. \u041f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u0431\u044b\u043b\u0438 \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0442\u0440\u0438 \u043c\u0435\u0441\u044f\u0446\u0430. \u041d\u043e \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043d\u0435\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/razrabotat-videoplatformu-za-90-dnej\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432\u0438\u0434\u0435\u043e\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0437\u0430 90 \u0434\u043d\u0435\u0439 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u042d\u0442\u043e\u0439 \u0432\u0435\u0441\u043d\u043e\u0439 \u043c\u044b \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u0432 \u043e\u0447\u0435\u043d\u044c \u0432\u0435\u0441\u0451\u043b\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445. \u0418\u0437-\u0437\u0430 \u043f\u0430\u043d\u0434\u0435\u043c\u0438\u0438 \u0441\u0442\u0430\u043b\u043e \u044f\u0441\u043d\u043e, \u0447\u0442\u043e \u043d\u0430\u0448\u0438 \u043b\u0435\u0442\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u044c \u0432 \u043e\u043d\u043b\u0430\u0439\u043d. \u0410 \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0438\u0445 \u0432 \u043e\u043d\u043b\u0430\u0439\u043d\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043d\u0430\u043c \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u043b\u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0441\u043e\u0444\u0442\u043e\u0432\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435. \u0418 \u043d\u0430 \u044d\u0442\u043e \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b\u043e \u0442\u0440\u0438 \u043c\u0435\u0441\u044f\u0446\u0430. \u041f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u0431\u044b\u043b\u0438 \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0442\u0440\u0438 \u043c\u0435\u0441\u044f\u0446\u0430. \u041d\u043e \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043d\u0435\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/razrabotat-videoplatformu-za-90-dnej\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-08-29T05:42:06+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-08-29T05:42:06+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Entwickeln Sie eine Video-Plattform in 90 Tagen | ProHoster","description":"In diesem Fr\u00fchling standen wir vor einer sehr am\u00fcsanten Herausforderung. Aufgrund der Pandemie wurde klar, dass wir unsere Sommerkonferenzen online abhalten mussten. Doch um dies qualitativ hochwertig zu gestalten, waren vorkonfigurierte Softwarel\u00f6sungen nicht ausreichend; wir mussten unsere eigene Plattform entwickeln. Daf\u00fcr hatten wir drei Monate Zeit. Es war offensichtlich, dass dies spannende drei Monate waren. Aber aus der Perspektive von au\u00dfen,","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/razrabotat-videoplatformu-za-90-dnej","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432\u0438\u0434\u0435\u043e\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0437\u0430 90 \u0434\u043d\u0435\u0439 | ProHoster","og:description":"\u042d\u0442\u043e\u0439 \u0432\u0435\u0441\u043d\u043e\u0439 \u043c\u044b \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u0432 \u043e\u0447\u0435\u043d\u044c \u0432\u0435\u0441\u0451\u043b\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445. \u0418\u0437-\u0437\u0430 \u043f\u0430\u043d\u0434\u0435\u043c\u0438\u0438 \u0441\u0442\u0430\u043b\u043e \u044f\u0441\u043d\u043e, \u0447\u0442\u043e \u043d\u0430\u0448\u0438 \u043b\u0435\u0442\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u044c \u0432 \u043e\u043d\u043b\u0430\u0439\u043d. \u0410 \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0438\u0445 \u0432 \u043e\u043d\u043b\u0430\u0439\u043d\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043d\u0430\u043c \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u043b\u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0441\u043e\u0444\u0442\u043e\u0432\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435. \u0418 \u043d\u0430 \u044d\u0442\u043e \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b\u043e \u0442\u0440\u0438 \u043c\u0435\u0441\u044f\u0446\u0430. \u041f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u0431\u044b\u043b\u0438 \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0442\u0440\u0438 \u043c\u0435\u0441\u044f\u0446\u0430. \u041d\u043e \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043d\u0435","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/razrabotat-videoplatformu-za-90-dnej","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-08-29T05:42:06+00:00","article:modified_time":"2020-08-29T05:42:06+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"92595","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 12:06:02","updated":"2022-09-30 11:38:11"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/92595","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=92595"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/92595\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/92596"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=92595"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=92595"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=92595"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}