
Obwohl serverlose Technologien in den letzten Jahren schnell an Popularität gewonnen haben, sind nach wie vor viele Missverständnisse und Bedenken damit verbunden. Abhängigkeit vom Anbieter, Tools, Kostenmanagement, Kaltstart, Monitoring und Lebenszyklus der Entwicklung – all diese Themen werden intensiv diskutiert, wenn es um serverlose Technologien geht. In diesem Artikel werden wir einige der genannten Themen aufgreifen und Tipps sowie Links zu nützlichen Informationsquellen bereitstellen, mit deren Hilfe Neulinge leistungsstarke, flexible und kosteneffiziente serverlose Anwendungen erstellen können.
Missverständnisse über serverlose Technologien
Viele glauben, dass Serverlosigkeit und serverlose Datenverarbeitung (, FaaS) nahezu dasselbe sind. Das bedeutet, dass der Unterschied nicht allzu groß ist und es sich lohnt, die neue Technologie einzuführen. Obwohl AWS Lambda einer der „Stars“ des Aufschwungs der serverlosen Technologien und ein beliebtes Element der serverlosen Architektur war, stellt diese Architektur jedoch mehr dar als nur FaaS.
Das grundlegende Prinzip serverloser Technologien besteht darin, dass Sie sich nicht um das Management und die Skalierung der Infrastruktur kümmern müssen; Sie zahlen nur für das, was Sie verwenden. Viele Dienste entsprechen diesen Kriterien – AWS DynamoDB, S3, SNS oder SQS, Graphcool, Auth0, Now, Netlify, Firebase und viele andere. Im Allgemeinen impliziert Serverlosigkeit die Nutzung aller Möglichkeiten des Cloud-Computings, ohne die Infrastruktur verwalten und optimieren zu müssen, um sie zu skalieren. Dies bedeutet auch, dass die Sicherheit auf Infrastrukturebene nicht mehr Ihr Problem ist, was ein enormes Vorteil ist, angesichts der Schwierigkeiten und Komplexitäten, die mit der Einhaltung von Sicherheitsstandards verbunden sind. Schließlich müssen Sie keine Infrastruktur kaufen, die Ihnen zur Verfügung gestellt wird.
Serverlosigkeit kann als „Zustand des Geistes“ betrachtet werden: eine bestimmte Mentalität bei der Gestaltung von Lösungen. Vermeiden Sie Ansätze, die die Wartung irgendeiner Infrastruktur erfordern. Bei einem serverlosen Ansatz verbringen wir die Zeit mit der Lösung von Aufgaben, die sich direkt auf das Projekt auswirken und unseren Nutzern Vorteile bringen: Wir schaffen nachhaltige Geschäftslogik, entwickeln Benutzeroberflächen und gestalten anpassungsfähige und zuverlässige APIs.
Zum Beispiel, wenn es möglich ist, die Verwaltung und den Support einer Plattform für die Volltextsuche zu vermeiden, dann werden wir genau das tun. Dieser Ansatz zur Erstellung von Anwendungen kann die Markteinführungszeit erheblich verkürzen, da Sie sich nicht mehr um die Verwaltung einer komplexen Infrastruktur kümmern müssen. Befreien Sie sich von Verpflichtungen und Kosten für die Infrastrukturverwaltung und konzentrieren Sie sich darauf, Anwendungen und Dienste zu entwickeln, die Ihre Kunden benötigen. Patrick Debois nannte diesen Ansatz , dieser Begriff wird in der serverlosen Gemeinschaft verwendet. Funktionen sollten als Bindeglied für Dienste in Form von bereitstellbaren Modulen betrachtet werden (anstatt eine ganze Bibliothek oder Webanwendung bereitzustellen). Dies ermöglicht eine unglaubliche Granularität in der Verwaltung von Bereitstellungen und Änderungen in der Anwendung. Wenn Sie Funktionen nicht auf diese Weise bereitstellen können, könnte das darauf hinweisen, dass die Funktionen zu viele Aufgaben erfüllen und refaktoriert werden müssen.
Einige sind durch die Abhängigkeit von Anbietern bei der Entwicklung von Cloud-Anwendungen verunsichert. Dasselbe gilt für serverlose Technologien, und es ist kaum ein Irrtum. Nach unseren Erfahrungen formen die Erstellung serverloser Anwendungen auf AWS, kombiniert mit der Fähigkeit von AWS Lambda, andere AWS-Dienste zu integrieren, teilweise die Vorteile serverloser Architekturen. Dies ist ein gutes Beispiel für Synergie, bei der das Ergebnis der Kombination größer ist als die bloße Summe der Einzelteile. Wenn Sie versuchen, die Abhängigkeit von Anbietern zu vermeiden, können Sie auf noch größere Probleme stoßen. Bei der Arbeit mit Containern ist es einfacher, Ihre eigene Abstraktionsebene zwischen Cloud-Anbietern zu steuern. Wenn es jedoch um serverlose Lösungen geht, werden die Bemühungen nicht rentabel sein, insbesondere wenn Sie von Anfang an die Wirtschaftlichkeit berücksichtigen. Stellen Sie sicher, wie die Anbieter die Dienstleistung bereitstellen. Einige spezialisierte Dienste hängen von Integrationspunkten mit anderen Anbietern ab und können von Haus aus eine Plug-and-Play-Verbindung bieten. Es ist einfacher, Lambda aus einem API-Gateway-Endpunkt aufzurufen, als eine Anfrage an einen Container oder eine EC2-Instanz zu proxyen. Graphcool bietet eine einfache Konfiguration mit Auth0, was einfacher ist, als Drittanbieter-Authentifizierungsmittel zu nutzen.
Die Wahl des richtigen Anbieters für Ihre serverlose Anwendung ist eine architektonische Entscheidung. Bei der Erstellung einer Anwendung rechnen Sie nicht damit, eines Tages zur Verwaltung von Servern zurückzukehren. Die Wahl des Cloud-Anbieters unterscheidet sich nicht von der Wahl der Verwendung von Containern oder einer Datenbank oder sogar einer Programmiersprache.
Überlegen Sie:
- Welche Dienste benötigen Sie und warum.
- Welche Dienste bieten die Cloud-Anbieter an und wie können Sie diese mit dem gewählten FaaS-Lösung kombinieren.
- Welche Programmiersprachen werden unterstützt (mit dynamischer oder statischer Typisierung, kompiliert oder interpretiert, welche Benchmarks gibt es, wie ist die Leistung beim Kaltstart, wie steht es um das Open-Source-Ökosystem usw.).
- Wie lauten Ihre Sicherheitsanforderungen (SLA, 2FA, OAuth, HTTPS, SSL usw.).
- Wie verwalten Sie Ihr CI/CD und die Softwareentwicklungzyklen.
- Von welchen Infrastruktur-als-Code-Lösungen können Sie profitieren.
Wenn Sie eine bestehende Anwendung erweitern und schrittweise serverlose Funktionen hinzufügen, kann dies die verfügbaren Möglichkeiten etwas einschränken. Dennoch bieten fast alle serverlosen Technologien einige APIs (über REST oder Nachrichtenwarteschlangen), die es ermöglichen, Erweiterungen unabhängig vom Kern der Anwendung und mit einfacher Integration zu erstellen. Suchen Sie nach Diensten mit klaren APIs, guter Dokumentation und einer starken Community, und Sie werden nicht falsch liegen. Die Einfachheit der Integration kann oft eine entscheidende Kennzahl sein und ist wahrscheinlich einer der Hauptgründe für den Erfolg von AWS seit der Einführung von Lambda im Jahr 2015.
Wann ist Serverlosigkeit nützlich?
Serverlose Technologien können praktisch überall eingesetzt werden. Ihre Vorteile beschränken sich jedoch nicht nur auf Anwendungsbereiche. Die Einstiegshürde für Cloud-Computing ist heute dank serverloser Technologien so niedrig. Wenn Entwickler eine Idee haben, aber nicht wissen, wie sie die Cloud-Infrastruktur verwalten und Kosten optimieren können, brauchen sie keinen Ingenieur dafür zu suchen. Wenn ein Start-up eine Plattform entwickeln möchte, aber befürchtet, dass die Kosten außer Kontrolle geraten könnten, kann es problemlos auf serverlose Lösungen zurückgreifen.
Dank der Kosteneinsparungen und der einfachen Skalierbarkeit sind serverlose Lösungen sowohl für interne als auch für externe Systeme anwendbar, bis hin zu Webanwendungen mit Millionen von Nutzern. Die Rechnungen werden eher in Cent als in Euro gemessen. Die Miete für das einfachste AWS EC2-Modell (t1.micro) kostet für einen Monat 15 €, selbst wenn Sie damit nichts machen (wer hat nicht schon mal vergessen, es auszuschalten?!). Zum Vergleich: Um denselben Kostenpunkt innerhalb des gleichen Zeitraums zu erreichen, müssten Sie eine Lambda-Funktion mit 512 MB etwa 3 Millionen Mal für 1 Sekunde ausführen. Wenn Sie diese Funktion jedoch nicht nutzen, zahlen Sie nichts.
Da die serverlose Technologie hauptsächlich von Ereignissen abhängt, kann die serverlose Infrastruktur relativ einfach in alte Systeme integriert werden. Zum Beispiel können Sie mit AWS S3, Lambda und Kinesis einen Analysedienst für ein altes Einzelhandelssystem erstellen, der Daten über eine API sammeln kann.
Die meisten serverlosen Plattformen unterstützen verschiedene Sprachen. Am häufigsten sind dies Python, JavaScript, C#, Java und Go. In der Regel gibt es in allen Sprachen keine Einschränkungen bei der Nutzung von Bibliotheken, sodass Sie Ihre bevorzugten Open-Source-Bibliotheken verwenden können. Es ist jedoch ratsam, Abhängigkeiten nicht übermäßig zu nutzen, damit Ihre Funktionen optimal ausgeführt werden und die Vorteile der enormen Skalierbarkeit Ihrer serverlosen Anwendungen nicht verloren gehen. Je mehr Pakete in den Container geladen werden müssen, desto länger dauert der Kaltstart.
Ein Kaltstart ist, wenn der Container, die Ausführungsumgebung und der Fehlerhandler zunächst initialisiert werden müssen, bevor sie verwendet werden können. Dadurch kann die Ausführungsverzögerung von Funktionen bis zu 3 Sekunden betragen, was für ungeduldige Nutzer nicht ideal ist. Kaltstarts treten jedoch beim ersten Zugriff nach mehreren Minuten Inaktivität der Funktion auf. Daher betrachten viele dies als eine geringfügige Unannehmlichkeit, die durch regelmäßiges Pingen der Funktion umgangen werden kann, um sie im Leerlauf zu halten. Oder sie ignorieren diesen Aspekt ganz.
Obwohl AWS, sind SQL-Datenbanken für solche Anwendungen nicht ideal, da sie bei der Ausführung von Transaktionen von Verbindungen abhängen, die bei hohem Datenverkehr auf AWS Lambda schnell zu einem Engpass werden können. Ja, die Entwickler verbessern kontinuierlich Serverless Aurora, und Sie sollten mit ihr experimentieren, jedoch sind heute NoSQL-Lösungen wiesehr viel besser geeignet für serverlose Systeme. Es ist jedoch unbestreitbar, dass sich diese Situation bald ändern wird.
Die Werkzeuge bringen ebenfalls viele Einschränkungen mit sich, insbesondere im Bereich des lokalen Testens. Obwohl es Lösungen wie Docker-Lambda, DynamoDB Local und LocalStack gibt, erfordern diese jedoch sorgfältige Arbeit und einen erheblichen Konfigurationsaufwand. Dennoch entwickeln sich all diese Projekte aktiv weiter, und es ist nur eine Frage der Zeit, bis die Werkzeuge das notwendige Niveau erreichen.
Einfluss serverloser Technologien auf den Entwicklungszyklus
Da Ihre Infrastruktur einfach eine Konfiguration darstellt, können Sie Code über Skripte bereitstellen und bereitstellen, beispielsweise über Shell-Skripte. Alternativ können Sie Lösungen der Klasse Configuration-as-Code wie . Obwohl dieser Service nicht für alle Bereiche eine Konfiguration bereitstellt, ermöglicht er dennoch die Definition spezifischer Ressourcen zur Verwendung als Lambda-Funktionen. Das heißt, dort, wo CloudFormation versagt, können Sie Ihre eigene Ressource (Lambda-Funktion) schreiben, die diese Lücke schließt. So können Sie alles Mögliche tun, sogar Abhängigkeiten außerhalb Ihrer AWS-Umgebung konfigurieren.
Da all dies nur Konfiguration ist, können Sie Ihre Bereitstellungsskripte für bestimmte Umgebungen, Regionen und Benutzer parametrisieren, insbesondere wenn Sie Lösungen der Kategorie Infrastructure-as-Code wie CloudFormation verwenden. Zum Beispiel können Sie eine Kopie der Infrastruktur für jeden Branch im Repository bereitstellen, um diese vollständig isoliert während der Entwicklung zu testen. Dies beschleunigt die Rückmeldung für Entwickler erheblich, wenn sie verstehen möchten, ob ihr Code in einer Live-Umgebung ordnungsgemäß funktioniert. Führungskräfte müssen sich keine Gedanken über die Kosten für die Bereitstellung zahlreicher Umgebungen machen, da nur die tatsächliche Nutzung bezahlt wird.
DevOps haben weniger Sorgen, da sie lediglich sicherstellen müssen, dass die Entwickler die korrekte Konfiguration haben. Es ist nicht mehr nötig, Instanzen, Load Balancer oder Sicherheitsgruppen zu verwalten. Daher wird der Begriff NoOps immer häufiger verwendet, obwohl es dennoch wichtig ist, die Infrastruktur konfigurieren zu können, insbesondere wenn es um IAM-Konfigurationen und die Optimierung von Cloud-Ressourcen geht.
Es gibt sehr leistungsstarke Werkzeuge zur Überwachung und visuellen Darstellung wie Epsagon, Thundra, Dashbird und IOPipe. Sie ermöglichen es, den aktuellen Zustand serverloser Anwendungen zu überwachen, bieten Logs und Tracing, erfassen Leistungskennzahlen und Architekturengpässe, führen Analysen und Kostenprognosen durch und vieles mehr. Sie geben nicht nur DevOps-Ingenieuren, Entwicklern und Architekten einen umfassenden Überblick über die Funktionsweise von Anwendungen, sondern ermöglichen auch Führungskräften, die Situation in Echtzeit zu verfolgen, mit sekundengenauen Ausgaben für Ressourcen und Kostenprognosen. Solch eine Organisation ist mit verwalteter Infrastruktur viel schwieriger.
Es ist deutlich einfacher, serverlose Anwendungen zu entwerfen, da Sie keine Webserver bereitstellen, virtuelle Maschinen oder Container verwalten, Server, Betriebssysteme oder Internet-Gateways patchen müssen usw. Die Abstrahierung von all diesen Aufgaben ermöglicht es der serverlosen Architektur, sich auf das Wesentliche zu konzentrieren – das Lösen der Bedürfnisse von Unternehmen und Kunden.
Obwohl das Toolset besser sein könnte (es verbessert sich täglich), können sich die Entwickler auf die Implementierung der Geschäftslogik und die optimale Verteilung der Komplexität der Anwendung auf verschiedene Dienste innerhalb der Architektur konzentrieren. Das Management serverloser Anwendungen erfolgt ereignisgesteuert und ist vom Cloud-Anbieter abstrahiert (z. B. SQS, S3-Ereignisse oder DynamoDB-Streams). Daher müssen die Entwickler lediglich die Geschäftslogik für die Reaktion auf bestimmte Ereignisse schreiben und sich keine Sorgen machen, wie sie Datenbanken und Nachrichtenwarteschlangen am besten implementieren oder wie sie die optimale Datenverarbeitung in bestimmten Hardware-Speichern organisieren.
Code kann lokal ausgeführt und debuggt werden, wie bei jedem Entwicklungsprozess. Das modulare Testen bleibt unverändert. Die Möglichkeit, eine gesamte Anwendungsinfrastruktur mit einer konfigurierbaren Stack-Konfiguration bereitzustellen, ermöglicht es Entwicklern, schnell wertvolles Feedback zu erhalten, ohne sich Gedanken über die Testkosten oder die Auswirkungen auf teure verwaltete Umgebungen machen zu müssen.
Werkzeuge und Methoden zum Erstellen serverloser Anwendungen
Es gibt keinen spezifischen Ansatz zur Erstellung serverloser Anwendungen. Ebenso wenig wie es ein festes Set von Diensten für diese Aufgabe gibt. Führend unter den leistungsstarken serverlosen Lösungen ist derzeit AWS, aber beachten Sie auch , und . Wenn Sie AWS verwenden, wird als Ansatz zur Anwendungserstellung empfohlen (SAM), insbesondere bei der Verwendung von C#, da Visual Studio hervorragende Werkzeuge bietet. SAM CLI kann alles tun, was auch Visual Studio kann, sodass Sie nichts verlieren, wenn Sie zu einer anderen IDE oder einem Texteditor wechseln. Natürlich funktioniert SAM auch mit anderen Sprachen.
Wenn Sie in anderen Sprachen schreiben, ist das Serverless Framework ein hervorragendes Open-Source-Tool, mit dem Sie alles mit sehr leistungsstarken YAML-Konfigurationsdateien konfigurieren können. Das Serverless Framework unterstützt auch verschiedene Cloud-Dienste, daher empfehlen wir es allen, die nach einer Multi-Cloud-Lösung suchen. Es hat eine riesige Community, die eine Vielzahl von Plugins für alle Bedürfnisse erstellt hat.
Für lokale Tests eignen sich Open-Source-Tools wie Docker-Lambda, Serverless Local, DynamoDB Local und LocalStack gut. Serverlose Technologien befinden sich noch in einem frühen Entwicklungsstadium, ebenso wie die Werkzeuge dafür, daher müssen Sie sich bei der Anpassung an komplexe Testszenarien anstrengen. Es ist jedoch unglaublich kostengünstig, einfach einen Stack in einer Umgebung bereitzustellen und dort zu testen. Und Sie müssen keine exakt lokale Kopie der Cloud-Umgebungen erstellen.
Verwenden Sie AWS Lambda Layers, um die Größe der bereitgestellten Pakete zu verringern und die Ladegeschwindigkeit zu erhöhen.
Verwenden Sie für spezifische Aufgaben die richtigen Programmiersprachen. Verschiedene Sprachen haben ihre eigenen Vor- und Nachteile. Es gibt viele Benchmarks, aber JavaScript, Python und C# (.NET Core 2.1+) sind in Bezug auf die Leistung von AWS Lambda führend. Neu in AWS Lambda ist die Runtime API, die es ermöglicht, die gewünschte Sprache und Laufzeit anzugeben, also experimentieren Sie.
Halten Sie die Paketgröße für die Bereitstellung klein. Je kleiner sie sind, desto schneller werden sie geladen. Vermeiden Sie es, große Bibliotheken zu verwenden, insbesondere wenn Sie nur einige Funktionen daraus nutzen. Wenn Sie in JavaScript programmieren, nutzen Sie Tools wie Webpack, um den Build zu optimieren und nur das einzuschließen, was Sie wirklich benötigen. In .NET Core 3.0 gibt es QuickJit und Tiered Compilation, die die Leistung verbessern und bei kalten Starts erheblich helfen.
Die Abhängigkeit von serverlosen Funktionen von Ereignissen kann anfänglich die Koordination der Geschäftslogik erschweren. In diesem Zusammenhang können Warteschlangen und endliche Automaten äußerst nützlich sein. Lambda-Funktionen können sich gegenseitig aufrufen, tun Sie dies jedoch nur, wenn Sie nicht mit einer Antwort rechnen ("abgeschossen und vergessen") – Sie möchten ja keine Rechnung für das Warten auf den Abschluss einer anderen Funktion erhalten. Warteschlangen sind nützlich, um Teile der Geschäftslogik zu isolieren, Engpässe in Anwendungen zu verwalten und Transaktionen (mithilfe von FIFO-Warteschlangen) zu verarbeiten. AWS Lambda-Funktionen können SQS-Warteschlangen zugeordnet werden, die als Warteschlangen für "hängende" Nachrichten fungieren und fehlgeschlagene Nachrichten für eine spätere Analyse nachverfolgen. AWS Step Functions (endliche Automaten) sind sehr hilfreich für das Management komplexer Prozesse, die die Erstellung von Funktionsketten erfordern. Anstatt dass eine Lambda-Funktion eine andere Funktion aufruft, können Step-Funktionen den Zustandübergang koordinieren, Daten zwischen Funktionen übermitteln und den globalen Zustand der Funktionen verwalten. Dies ermöglicht die Definition von Bedingungen für Wiederholungsversuche oder was im Falle eines bestimmten Fehlers zu tun ist – unter bestimmten Bedingungen ein äußerst leistungsfähiges Werkzeug.
Fazit
In den letzten Jahren entwickeln sich serverlose Technologien in einem nie da gewesenen Tempo. Mit diesem Paradigmenwechsel sind bestimmte Missverständnisse verbunden. Durch die Abstraktion von Infrastruktur und das Management von Skalierung bieten serverlose Lösungen erhebliche Vorteile: von der Vereinfachung der Entwicklungs- und DevOps-Prozesse bis hin zu erheblichen Einsparungen bei den Betriebskosten.
Obwohl der serverlose Ansatz nicht ohne Nachteile ist, gibt es jedoch zuverlässige Entwurfsmuster, mit denen Sie robuste serverlose Anwendungen erstellen oder serverlose Elemente in bestehende Architekturen integrieren können.
Quelle: habr.com
