Tipps und Ressourcen zum Erstellen serverloser Anwendungen

Tipps und Ressourcen zum Erstellen serverloser Anwendungen
Obwohl serverlose Technologien in den letzten Jahren rasant an Popularität gewonnen haben, sind mit ihnen immer noch viele Missverständnisse und Ängste verbunden. Anbieterabhängigkeit, Tools, Kostenmanagement, Kaltstart, Überwachung und Entwicklungslebenszyklus sind allesamt heiße Themen, wenn es um serverlose Technologien geht. In diesem Artikel gehen wir auf einige der genannten Themen ein und geben Tipps und Links zu hilfreichen Informationsquellen weiter, um Anfängern bei der Erstellung leistungsstarker, flexibler und kostengünstiger serverloser Anwendungen zu helfen.

Missverständnisse über serverlose Technologien

Viele Leute denken, dass serverlose und serverlose Verarbeitung (Funktionen als Service, FaaS) sind fast dasselbe. Das bedeutet, dass der Unterschied nicht zu groß ist und es sich lohnt, eine Neuheit einzuführen. Obwohl AWS Lambda einer der Stars der Serverless-Blütezeit und eines der beliebtesten Elemente der Serverless-Architektur war, ist diese Architektur viel mehr als FaaS.

Das Grundprinzip serverloser Technologien besteht darin, dass Sie sich keine Gedanken über die Verwaltung und Skalierung Ihrer Infrastruktur machen müssen, sondern nur für das bezahlen, was Sie nutzen. Viele Dienste erfüllen diese Kriterien – AWS DynamoDB, S3, SNS oder SQS, Graphcool, Auth0, Now, Netlify, Firebase und viele andere. Im Allgemeinen bedeutet serverlos, die volle Leistung des Cloud Computing zu nutzen, ohne die Infrastruktur verwalten und für die Skalierung optimieren zu müssen. Dies bedeutet auch, dass die Sicherheit auf Infrastrukturebene nicht länger Ihr Anliegen ist, was angesichts der Schwierigkeit und Komplexität der Einhaltung von Sicherheitsstandards ein großer Vorteil ist. Schließlich müssen Sie die Ihnen zur Verfügung gestellte Infrastruktur nicht kaufen.

Serverlos kann als „Geisteszustand“ betrachtet werden: eine bestimmte Mentalität beim Entwerfen von Lösungen. Vermeiden Sie Ansätze, die die Wartung jeglicher Infrastruktur erfordern. Mit einem serverlosen Ansatz verbringen wir Zeit damit, Aufgaben zu lösen, die sich direkt auf das Projekt auswirken und unseren Benutzern Vorteile bringen: Wir erstellen nachhaltige Geschäftslogik, entwickeln Benutzeroberflächen und entwickeln adaptive und zuverlässige APIs.

Wenn es beispielsweise möglich ist, die Verwaltung und Wartung einer Freitextsuchplattform zu vermeiden, dann werden wir das tun. Dieser Ansatz zum Erstellen von Anwendungen kann die Markteinführungszeit erheblich verkürzen, da Sie sich keine Gedanken mehr über die Verwaltung komplexer Infrastrukturen machen müssen. Beseitigen Sie die Verantwortung und die Kosten für das Infrastrukturmanagement und konzentrieren Sie sich auf die Entwicklung der Anwendungen und Dienste, die Ihre Kunden benötigen. Patrick Debois nannte diesen Ansatz 'servicevoll', der Begriff wird in der Serverless-Community übernommen. Funktionen sollten als Link zu Diensten als bereitstellbare Module betrachtet werden (anstatt eine ganze Bibliothek oder Webanwendung bereitzustellen). Dies bietet eine unglaubliche Granularität für die Verwaltung der Bereitstellung und Änderungen an der Anwendung. Wenn Sie Funktionen auf diese Weise nicht bereitstellen können, kann dies darauf hindeuten, dass die Funktionen zu viele Aufgaben ausführen und umgestaltet werden müssen.

Manche sind verwirrt über die Abhängigkeit vom Anbieter bei der Entwicklung von Cloud-Anwendungen. Das Gleiche gilt auch für serverlose Technologien, und das ist kaum ein Missverständnis. Unserer Erfahrung nach ist die Entwicklung serverloser Anwendungen auf AWS in Kombination mit der Fähigkeit von AWS Lambda, andere AWS-Dienste zu bündeln, Teil der Stärke serverloser Architekturen. Dies ist ein gutes Beispiel für Synergie, wenn das Ergebnis der Kombination mehr als nur die Summe der Begriffe ist. Der Versuch, die Anbieterabhängigkeit zu vermeiden, kann zu noch mehr Problemen führen. Wenn Sie mit Containern arbeiten, ist es einfacher, Ihre eigene Abstraktionsschicht zwischen Cloud-Anbietern zu verwalten. Doch bei Serverless-Lösungen rechnet sich der Aufwand nicht, vor allem wenn die Wirtschaftlichkeit von Anfang an berücksichtigt wird. Informieren Sie sich unbedingt darüber, wie Anbieter ihre Dienstleistungen anbieten. Einige spezialisierte Dienste basieren auf Integrationspunkten mit anderen Anbietern und bieten möglicherweise sofort einsatzbereite Plug-and-Play-Konnektivität. Es ist einfacher, einen Lambda-Aufruf von einem Gateway-API-Endpunkt bereitzustellen, als die Anfrage per Proxy an einen Container oder eine EC2-Instanz weiterzuleiten. Graphcool bietet eine einfache Konfiguration mit Auth0, was einfacher ist als die Verwendung von Authentifizierungstools von Drittanbietern.

Die Wahl des richtigen Anbieters für Ihre serverlose Anwendung ist eine architektonische Entscheidung. Wenn Sie eine Anwendung erstellen, erwarten Sie nicht, dass Sie eines Tages wieder zur Verwaltung von Servern zurückkehren werden. Die Wahl eines Cloud-Anbieters unterscheidet sich nicht von der Entscheidung für die Verwendung von Containern, einer Datenbank oder sogar einer Programmiersprache.

Halten:

  • Welche Dienstleistungen benötigen Sie und warum.
  • Welche Dienste Cloud-Anbieter anbieten und wie Sie diese mit Ihrer gewählten FaaS-Lösung kombinieren können.
  • Welche Programmiersprachen werden unterstützt (mit dynamischer oder statischer Typisierung, kompiliert oder interpretiert, was sind die Benchmarks, wie ist die Leistung beim Kaltstart, was ist das Open-Source-Ökosystem usw.).
  • Was sind Ihre Sicherheitsanforderungen (SLA, 2FA, OAuth, HTTPS, SSL usw.)?
  • So verwalten Sie Ihre CI/CD- und Softwareentwicklungszyklen.
  • Welche Infrastructure-as-Code-Lösungen können Sie nutzen?

Wenn Sie eine vorhandene Anwendung erweitern und schrittweise serverlose Funktionalität hinzufügen, kann dies die verfügbaren Funktionen etwas einschränken. Allerdings bieten fast alle serverlosen Technologien eine Art API (über REST oder Nachrichtenwarteschlangen), mit der Sie Erweiterungen unabhängig vom Anwendungskern und mit einfacher Integration erstellen können. Suchen Sie nach Diensten mit klaren APIs, guter Dokumentation und einer starken Community, dann können Sie nichts falsch machen. Die einfache Integration kann oft eine Schlüsselkennzahl sein und ist wahrscheinlich einer der Hauptgründe, warum AWS seit der Veröffentlichung von Lambda im Jahr 2015 so erfolgreich ist.

Wenn serverlos gut ist

Serverlose Technologien können fast überall eingesetzt werden. Ihre Vorteile beschränken sich jedoch nicht nur auf eine Anwendungsart. Die Eintrittsbarriere 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 die Kosten optimieren können, müssen sie nicht nach einem Ingenieur suchen, der dies umsetzt. Wenn ein Startup eine Plattform aufbauen möchte, aber befürchtet, dass die Kosten außer Kontrolle geraten könnten, kann es problemlos auf serverlose Lösungen zurückgreifen.

Aufgrund der Kosteneinsparungen und der einfachen Skalierbarkeit sind serverlose Lösungen gleichermaßen für interne und externe Systeme anwendbar, bis hin zu einer Webanwendung mit einem Millionenpublikum. Konten werden nicht in Euro, sondern in Cent bemessen. Die Miete der einfachsten Instanz von AWS EC2 (t1.micro) für einen Monat kostet 15 €, auch wenn Sie nichts damit machen (wer hat nie vergessen, sie auszuschalten?!). Im Vergleich dazu müssten Sie, um dieses Ausgabenniveau im gleichen Zeitraum zu erreichen, etwa 512 Millionen Mal einen 1-MB-Lambda für 3 Sekunde ausführen. Und wenn Sie diese Funktion nicht nutzen, zahlen Sie nichts.

Da Serverless in erster Linie ereignisgesteuert ist, ist es relativ einfach, älteren Systemen eine Serverless-Infrastruktur hinzuzufügen. Mit AWS S3, Lambda und Kinesis können Sie beispielsweise einen Analysedienst für ein altes Einzelhandelssystem erstellen, das Daten über eine API empfangen kann.

Die meisten serverlosen Plattformen unterstützen mehrere Sprachen. Am häufigsten sind es Python, JavaScript, C#, Java und Go. Normalerweise gibt es keine Einschränkungen für die Nutzung von Bibliotheken in allen Sprachen, sodass Sie Ihre bevorzugten Open-Source-Bibliotheken verwenden können. Es ist jedoch ratsam, Abhängigkeiten nicht zu missbrauchen, damit Ihre Funktionen optimal funktionieren und die Vorteile der enormen Skalierbarkeit Ihrer serverlosen Anwendungen nicht zunichte gemacht werden. Je mehr Pakete in den Container geladen werden müssen, desto länger dauert der Kaltstart.

Bei einem Kaltstart müssen Sie zunächst den Container, die Laufzeit und den Fehlerhandler initialisieren, bevor Sie sie verwenden können. Aus diesem Grund kann die Verzögerung bei der Ausführung von Funktionen bis zu 3 Sekunden betragen, was für ungeduldige Benutzer nicht die beste Option ist. Allerdings kommt es beim ersten Aufruf nach einigen Minuten Leerlauffunktion zu Kaltstarts. Viele halten dies für ein kleines Ärgernis, das durch regelmäßiges Pingen der Funktion umgangen werden kann, um sie im Leerlauf zu halten. Oder sie ignorieren diesen Aspekt ganz.

Obwohl AWS veröffentlicht wurde Serverlose SQL-Datenbank Serverlose AuroraAllerdings sind SQL-Datenbanken für diese Anwendung nicht ideal, da sie für die Durchführung von Transaktionen auf Verbindungen angewiesen sind, was bei starkem Datenverkehr auf AWS Lambda schnell zu einem Engpass werden kann. Ja, die Entwickler verbessern Serverless Aurora ständig, und Sie sollten damit experimentieren, aber heute gefallen NoSQL-Lösungen DynamoDB. Es besteht jedoch kein Zweifel daran, dass sich diese Situation sehr bald ändern wird.

Das Toolkit bringt auch viele Einschränkungen mit sich, insbesondere im Bereich des lokalen Testens. Obwohl es Lösungen wie Docker-Lambda, DynamoDB Local und LocalStack gibt, erfordern sie harte Arbeit und einen erheblichen Konfigurationsaufwand. Alle diese Projekte werden jedoch aktiv weiterentwickelt, sodass es nur eine Frage der Zeit ist, bis das Toolkit das von uns benötigte Niveau erreicht.

Die Auswirkungen serverloser Technologien auf den Entwicklungszyklus

Da es sich bei Ihrer Infrastruktur lediglich um eine Konfiguration handelt, können Sie Code mithilfe von Skripten, beispielsweise Shell-Skripten, definieren und bereitstellen. Oder Sie können auf Konfigurations-als-Code-Klassenlösungen wie zurückgreifen AWS CloudFormation. Obwohl dieser Dienst nicht die Konfiguration für alle Bereiche bereitstellt, ermöglicht er Ihnen die Definition spezifischer Ressourcen zur Verwendung als Lambda-Funktionen. Das heißt, wo CloudFormation versagt, können Sie Ihre eigene Ressource (Lambda-Funktion) schreiben, die diese Lücke schließt. Auf diese Weise können Sie alles tun, sogar Abhängigkeiten außerhalb Ihrer AWS-Umgebung konfigurieren.

Da es sich lediglich um eine Konfiguration handelt, können Sie Ihre Bereitstellungsskripts für bestimmte Umgebungen, Regionen und Benutzer anpassen, insbesondere wenn Sie Infrastructure-as-Code-Lösungen wie CloudFormation verwenden. Beispielsweise können Sie für jeden Zweig im Repository eine Kopie der Infrastruktur bereitstellen, sodass Sie diese während der Entwicklung vollständig isoliert testen können. Dies beschleunigt das Feedback für Entwickler erheblich, wenn sie verstehen möchten, ob ihr Code in einer Live-Umgebung angemessen funktioniert. Manager müssen sich keine Gedanken über die Kosten für die Bereitstellung mehrerer Umgebungen machen, da sie nur für die tatsächliche Nutzung zahlen.

DevOps müssen sich weniger Sorgen machen, da sie nur sicherstellen müssen, dass die Entwickler über die richtige Konfiguration verfügen. Sie müssen keine Instanzen, Balancer oder Sicherheitsgruppen mehr verwalten. Daher wird immer häufiger der Begriff NoOps verwendet, obwohl es nach wie vor wichtig ist, die Infrastruktur konfigurieren zu können, insbesondere wenn es um die IAM-Konfiguration und die Optimierung von Cloud-Ressourcen geht.

Es gibt sehr leistungsstarke Überwachungs- und Visualisierungstools wie Epsagon, Thundra, Dashbird und IOPipe. Sie ermöglichen Ihnen, den aktuellen Status Ihrer serverlosen Anwendungen zu überwachen, Protokollierung und Ablaufverfolgung bereitzustellen, Leistungsmetriken und Architekturengpässe zu erfassen, Kostenanalysen und -prognosen durchzuführen und vieles mehr. Sie bieten DevOps-Ingenieuren, -Entwicklern und -Architekten nicht nur einen umfassenden Überblick über die Anwendungsleistung, sondern ermöglichen es Managern auch, die Situation in Echtzeit zu überwachen, mit Ressourcenkosten pro Sekunde und Kostenprognosen. Mit einer verwalteten Infrastruktur ist dies deutlich schwieriger zu organisieren.

Das Entwerfen serverloser Anwendungen ist viel einfacher, da Sie keine Webserver bereitstellen, virtuelle Maschinen oder Container verwalten, Server, Betriebssysteme, Internet-Gateways usw. patchen müssen. Durch die Abstrahierung all dieser Verantwortlichkeiten kann sich eine serverlose Architektur auf den Kern konzentrieren – Die Lösung. Geschäfts- und Kundenbedürfnisse.

Während das Toolkit besser sein könnte (es wird jeden Tag besser), können sich Entwickler auf die Implementierung der Geschäftslogik und die optimale Verteilung der Komplexität der Anwendung auf verschiedene Dienste innerhalb der Architektur konzentrieren. Das serverlose Anwendungsmanagement ist ereignisbasiert und wird vom Cloud-Anbieter abstrahiert (z. B. SQS, S3-Ereignisse oder DynamoDB-Streams). Daher müssen Entwickler nur Geschäftslogik schreiben, um auf bestimmte Ereignisse zu reagieren, und müssen sich keine Gedanken darüber machen, wie Datenbanken und Nachrichtenwarteschlangen am besten implementiert werden oder wie die optimale Arbeit mit Daten in bestimmten Hardwarespeichern organisiert wird.

Code kann wie jeder Entwicklungsprozess lokal ausgeführt und debuggt werden. Unit-Tests bleiben gleich. Durch die Möglichkeit, eine gesamte Anwendungsinfrastruktur mit einer benutzerdefinierten Stack-Konfiguration bereitzustellen, können Entwickler schnell wichtiges Feedback erhalten, ohne über die Testkosten oder die Auswirkungen auf teure verwaltete Umgebungen nachdenken zu müssen.

Tools und Techniken zum Erstellen serverloser Anwendungen

Es gibt keine spezielle Möglichkeit, serverlose Anwendungen zu erstellen. Sowie eine Reihe von Diensten für diese Aufgabe. AWS ist heute führend unter den leistungsstarken serverlosen Lösungen, aber schauen Sie sich auch an Cumolocity, Zeit и Firebase. Wenn Sie AWS verwenden, wird zum Sammeln von Anwendungen folgender Ansatz empfohlen: Serverloses Anwendungsmodell (SAM), insbesondere bei Verwendung von C#, da Visual Studio über hervorragende Tools verfügt. Die SAM-CLI kann alles, was Visual Studio kann, sodass Sie nichts verlieren, wenn Sie zu einer anderen IDE oder einem anderen 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. Da das Serverless Framework auch verschiedene Cloud-Dienste unterstützt, empfehlen wir es allen, die eine Multi-Cloud-Lösung suchen. Es gibt eine riesige Community, die eine Reihe von Plugins für jeden Bedarf erstellt hat.

Für lokales Testen eignen sich die Open-Source-Tools Docker-Lambda, Serverless Local, DynamoDB Local und LocalStack gut. Serverlose Technologien befinden sich noch in einem frühen Entwicklungsstadium, ebenso wie die Tools dafür, sodass Sie bei der Einrichtung komplexer Testszenarien hart arbeiten müssen. Allerdings ist es unglaublich günstig, den Stack einfach in einer Umgebung bereitzustellen und dort zu testen. Und Sie müssen keine exakte lokale Kopie der Cloud-Umgebungen erstellen.

Verwenden Sie AWS Lambda Layers, um die Größe bereitgestellter Pakete zu reduzieren und Downloads zu beschleunigen.

Nutzen Sie die richtigen Programmiersprachen für bestimmte Aufgaben. Verschiedene Sprachen haben ihre eigenen Vor- und Nachteile. Es gibt viele Benchmarks, aber JavaScript, Python und C# (.NET Core 2.1+) sind hinsichtlich der AWS Lambda-Leistung führend. AWS Lambda hat kürzlich die Runtime-API eingeführt, mit der Sie Ihre gewünschte Laufzeitsprache und -umgebung angeben können, also experimentieren Sie.

Halten Sie die Paketgrößen für die Bereitstellung klein. Je kleiner sie sind, desto schneller werden sie geladen. Vermeiden Sie die Verwendung großer Bibliotheken, insbesondere wenn Sie einige ihrer Funktionen nutzen. Wenn Sie in JavaScript programmieren, verwenden Sie ein Build-Tool wie Webpack, um Ihren Build zu optimieren und nur das einzuschließen, was Sie wirklich benötigen. .NET Core 3.0 verfügt über QuickJit und Tiered Compilation, was die Leistung verbessert und bei Kaltstarts sehr hilfreich ist.

Die Abhängigkeit serverloser Funktionen von Ereignissen kann es zunächst schwierig machen, die Geschäftslogik zu koordinieren. In dieser Hinsicht können Nachrichtenwarteschlangen und Zustandsmaschinen unglaublich nützlich sein. Lambda-Funktionen können sich gegenseitig aufrufen, aber tun Sie dies nur, wenn Sie keine Antwort erwarten („feuern und vergessen“) – Sie möchten nicht für das Warten auf den Abschluss einer anderen Funktion in Rechnung gestellt werden. Nachrichtenwarteschlangen sind nützlich, um Teile der Geschäftslogik zu isolieren, Anwendungsengpässe zu verwalten und Transaktionen (mithilfe von FIFO-Warteschlangen) zu verarbeiten. AWS Lambda-Funktionen können SQS-Warteschlangen als feststeckende Nachrichtenwarteschlangen zugewiesen werden, die fehlgeschlagene Nachrichten für eine spätere Analyse verfolgen. AWS Step Functions (Zustandsmaschinen) sind sehr nützlich für die Verwaltung komplexer Prozesse, die eine Verkettung von Funktionen erfordern. Anstatt dass eine Lambda-Funktion eine andere Funktion aufruft, können Schrittfunktionen Zustandsübergänge koordinieren, Daten zwischen Funktionen übergeben und den globalen Zustand von Funktionen verwalten. Auf diese Weise können Sie Wiederholungsbedingungen definieren oder festlegen, was zu tun ist, wenn ein bestimmter Fehler auftritt – ein sehr leistungsfähiges Tool unter bestimmten Bedingungen.

Abschluss

In den letzten Jahren haben sich serverlose Technologien in einem beispiellosen Tempo entwickelt. Mit diesem Paradigmenwechsel sind gewisse Missverständnisse verbunden. Durch die Abstraktion der Infrastruktur und die Skalierung des Managements bieten serverlose Lösungen erhebliche Vorteile, von vereinfachten Entwicklungs- und DevOps-Prozessen bis hin zu massiven Reduzierungen der Betriebskosten.
Obwohl der serverlose Ansatz nicht ohne Nachteile ist, gibt es robuste Entwurfsmuster, mit denen robuste serverlose Anwendungen erstellt oder serverlose Elemente in bestehende Architekturen integriert werden können.

Source: habr.com

Kommentar hinzufügen