
Ich arbeite im Outsourcing, wo das Hauptprinzip mit dem Satz "Verkauf viel, mach schnell" beschrieben werden kann. Je schneller wir arbeiten, desto mehr verdienen wir. Dabei sollte alles stabil und von akzeptabler QualitÀt sein. Ich möchte von meinen Erfahrungen berichten, als es darum ging, einen Promo-Service in kurzer Zeit zu entwickeln.
Gegeben: Ein Root-Account bei AWS, keine EinschrĂ€nkungen bei der Auswahl des Technologie-Stacks, ein Backend-Entwickler und ein Monat fĂŒr die Entwicklung.
Aufgabe: Einen Promo-Service zu realisieren, bei dem Nutzer von einem bis zu vier Videos mit einer LĂ€nge von jeweils ein bis vier Sekunden hochladen, die dann in den Original-Videoinhalt eingebettet werden, ist die Aufgabe.
Lösung
Einen eigenen Service in so kurzer Zeit zu entwickeln, ist eine riskante Sache. Damit der Service die Last bewĂ€ltigen kann und alle Interessierten ihr gewĂŒnschtes Video erhalten, benötigen wir die passende Infrastruktur. Und idealerweise sollte sie nicht mit einem Preis wie fĂŒr ein Flugticket daherkommen. Daher orientieren wir uns sofort an fertigen Lösungen mit minimaler Anpassung.
Die Standardlösung fĂŒr die Arbeit mit Videos ist FFmpeg, ein plattformĂŒbergreifendes Konsolen-Tool, das es ermöglicht, Videos zu schneiden und Tonspuren hinzuzufĂŒgen. Der nĂ€chste Schritt besteht darin, eine Wrapper-Anwendung zu erstellen und diese zum Leben zu erwecken. Wir entwickeln einen Prototyp, der zwei Videos zusammenfĂŒgt, und dann beginnt das eigentliche Abenteuer. Die Bibliothek lĂ€uft auf .NET Core 2 und muss in jeder virtuellen Maschine funktionieren, also nehmen wir eine AWS EC2-Instanz, und alles wird funktionieren.
Versteckter Textnein, es wird nicht funktionieren
.
Obwohl FFmpeg die Aufgabe erleichtert, ist es fĂŒr eine wirklich funktionierende Lösung notwendig, eine EC2-Instanz zu erstellen und die Netzwerkinfrastruktur zu entwerfen, einschlieĂlich eines Load Balancers. Die einfache Aufgabe, von Grund auf neu zu deployen, wird âein wenigâ komplizierter, und die Infrastruktur beginnt sofort Geld zu kosten â jede Stunde wird ein Betrag vom Kundenkonto fĂŒr die Laufzeit abgezogen.
Unser Service sieht keine langlaufenden Prozesse vor, erfordert keine umfangreiche und schwere relationale Datenbank und passt hervorragend in eine eventbasierte Architektur mit einer Kette von Microservices. Die Lösung liegt auf der Hand â wir können auf EC2 verzichten und eine echte serverless Anwendung realisieren, Ă€hnlich den Standard-Image Resizern auf AWS Lambda.
Ăbrigens unterstĂŒtzen die Entwickler von AWS trotz ihrer offensichtlichen Abneigung gegen .NET .NET Core 2.1 als Runtime, was eine vollstĂ€ndige Palette an Entwicklungsmöglichkeiten bietet.
Das SahnehĂ€ubchen ist, dass AWS einen eigenen Dienst fĂŒr die Verarbeitung von Videodateien bereitstellt â AWS Elemental MediaConvert.
Die Funktionsweise ist unglaublich einfach: Wir nehmen den S3-Link zum Ausgangsvideo, geben ĂŒber die AWS Console, das .NET SDK oder einfach JSON an, was wir mit dem Video machen möchten, und rufen den Dienst auf. Er kĂŒmmert sich um die Verarbeitung der eingehenden Anfragen, lĂ€dt das Ergebnis selbst in S3 hoch und, was am wichtigsten ist, generiert fĂŒr jede StatusĂ€nderung ein CloudWatch-Ereignis. Dies ermöglicht es uns, Lambda-Trigger fĂŒr den Abschluss der Videoverarbeitung einzurichten.

So könnte die endgĂŒltige Architektur aussehen.
Der gesamte Backend-Bereich wird in zwei Lambdas untergebracht. Eine weitere dient der Rotation von vertikalen Videos, da diese Aufgabe nicht in einem Durchgang erledigt werden kann.
Die Front in Form einer SPA-Anwendung, die in JS geschrieben und ĂŒber Pug kompiliert wurde, wird in einem öffentlichen S3-Bucket bereitgestellt. Zum Hochladen der Videos benötigen wir keinen serverseitigen Code â es reicht aus, die REST-Endpunkte zu öffnen, die uns S3 bietet. Einzig zu beachten ist, dass wir die Richtlinien und CORS konfigurieren mĂŒssen.
Herausforderungen
- Aus unerfindlichen GrĂŒnden fĂŒgt AWS MediaConvert den Ton nur zu jedem Videoabschnitt einzeln hinzu, wĂ€hrend wir das gesamte fröhliche Lied aus dem Intro benötigen.
- Vertikale Videos mĂŒssen gesondert bearbeitet werden. AWS mag keine schwarzen Balken und dreht die Clips um 90°.
Einfache Lösung
Trotz der Schönheit von Stateless ist es notwendig zu verfolgen, was mit dem Video gemacht werden muss: ob es zusammengefĂŒgt oder der Ton ĂŒber das bereits vorhandene Videomaterial gelegt werden soll. GlĂŒcklicherweise unterstĂŒtzt MediaConvert die Ăbertragung von Metadaten ĂŒber seine Jobs, und wir können immer einfach ein Flag wie âisMasterSoundJobâ anwenden, indem wir diese Metadaten zu jedem Zeitpunkt analysieren.
Serverless ermöglicht ein effektives NoOps-Arbeitsmodell, bei dem keine separate Infrastruktur-Teams erforderlich sind. Daher lag es nur noch an der Implementierung einer Lösung auf AWS, ohne dass Systemadministratoren, die immer beschĂ€ftigt sind, eingebunden werden mĂŒssen.
Um diesen Prozess zu beschleunigen, automatisieren wir das Deployment mit einem Skript ĂŒber AWS CloudFormation, das ein Deployment auf Knopfdruck direkt aus Visual Studio ermöglicht. Am Ende ermöglicht eine 200-zeilige Datei die Bereitstellung einer vollstĂ€ndigen Lösung, obwohl die Syntax von CloudFormation anfangs schockierend sein kann.
Gesamt
Serverless ist keine universelle Lösung. Es erleichtert jedoch das Leben in Situationen mit drei EinschrĂ€nkungen: âbegrenzte Ressourcen â knappe Zeit â wenig Geld.â
Eigenschaften von Anwendungen, die fĂŒr Serverless geeignet sind
- keine lang laufenden Prozesse. Harte Begrenzung des API Gateways â 29 Sekunden, harte Begrenzung der Lambda-Funktionen â 5 Minuten;
- wird durch eine ereignisgetriebene Architektur beschrieben;
- wird in lose gekoppelte Komponenten, Àhnlich wie SOA, zerlegt;
- erfordert keine umfangreiche Arbeit mit dem eigenen Status;
- geschrieben in .NET Core. FĂŒr die Arbeit mit .NET Framework wird weiterhin mindestens Docker mit der entsprechenden Runtime benötigt.
Vorteile des Serverless-Ansatzes
- senkt die Infrastrukturkosten;
- senkt die Lieferkosten der Lösung;
- automatische Skalierbarkeit;
- Entwicklung an der Spitze des technischen Fortschritts.
Nachteile, am konkreten Beispiel
- Verteiltes Tracing und Logging â teilweise durch AWS X-Ray und AWS CloudWatch gelöst;
- umstÀndliches Debugging;
- Cold Start bei fehlender Last;
- Benutzerunfreundliche AWS-OberflĂ€che â ein allgemeines Problem đ
Quelle: habr.com
