Serverloses Computing mit AWS Lambda, Teil 1

Serverloses Computing mag heutzutage das heißeste im Cloud-Computing sein, aber was genau ist es? Dieses zweiteilige Tutorial beginnt mit einem Überblick über Serverless Computing - von dem, was es ist, warum es als störend für traditionelles Cloud Computing angesehen wird und wie Sie es möglicherweise in der Java-basierten Programmierung verwenden.

Im Anschluss an die Übersicht erhalten Sie eine praktische Einführung in AWS Lambda, das von vielen als die erste Java-basierte Lösung für Serverless Computing angesehen wird. In Teil 1 verwenden Sie AWS Lambda, um Ihre erste Lambda-Funktion in Java zu erstellen, bereitzustellen und zu testen. In Teil 2 integrieren Sie Ihre Lambda-Funktion in DynamoDB und rufen dann mit dem AWS SDK Lambda-Funktionen in einer Java-Anwendung auf.

Was ist Serverless Computing?

Letztes Jahr sprach ich mit einem Praktikanten über verschiedene Architekturmuster und erwähnte die Architektur ohne Server. Er bemerkte schnell, dass alle Anwendungen einen Server erfordern und nicht in der Luft laufen können. Der Praktikant hatte Recht, auch wenn er meinen vermisste. Serverless Computing ist keine magische Plattform zum Ausführen von Anwendungen.

In der Tat bedeutet Serverless Computing einfach, dass Sie als Entwickler sich nicht mit dem Server befassen müssen . Mit einer serverlosen Computerplattform wie AWS Lambda können Sie Ihren Code erstellen und bereitstellen, ohne jemals zugrunde liegende Server konfigurieren oder verwalten zu müssen. Ihre Bereitstellungseinheit ist Ihr Code. Nicht der Container, der den Code hostet, oder der Server, auf dem der Code ausgeführt wird, sondern einfach der Code selbst. Unter Produktivitätsgesichtspunkten bietet das Auslagern der Details, wo Code gespeichert ist und wie die Ausführungsumgebung verwaltet wird, offensichtliche Vorteile. Der Preis für Serverless Computing basiert auch auf Ausführungsmetriken, sodass auch ein finanzieller Vorteil besteht.

Was kostet AWS Lambda?

Zum Zeitpunkt dieses Schreibens basiert die Preisstufe von AWS Lambda auf der Anzahl der Ausführungen und der Ausführungsdauer:

  • Ihre ersten Millionen Hinrichtungen pro Monat sind kostenlos, danach zahlen Sie 0,20 USD pro Million Hinrichtungen (0,0000002 USD pro Anfrage).
  • Die Dauer wird ab dem Zeitpunkt berechnet, an dem Ihr Code ausgeführt wird, bis ein Ergebnis zurückgegeben wird, das auf die nächsten 100 ms gerundet ist. Der berechnete Betrag basiert auf dem der Funktion zugewiesenen RAM-Betrag, wobei die Kosten für jede GB-Sekunde 0,00001667 USD betragen.

Preisdetails und kostenlose Tierzuweisungen sind etwas komplizierter als in der Übersicht angegeben. Besuchen Sie die Preisstufe, um einige Preisszenarien durchzugehen.

Um eine Vorstellung davon zu bekommen, wie Serverless Computing funktioniert, beginnen wir mit dem Ausführungsmodell für Serverless Computing, das in Abbildung 1 dargestellt ist.

Steven Haines

Hier ist das serverlose Ausführungsmodell auf den Punkt gebracht:

  1. Ein Client fordert die serverlose Computerplattform auf, eine bestimmte Funktion auszuführen.
  2. Die serverlose Computerplattform prüft zunächst, ob die Funktion auf einem ihrer Server ausgeführt wird. Wenn die Funktion noch nicht ausgeführt wird, lädt die Plattform die Funktion aus einem Datenspeicher.
  3. Die Plattform stellt die Funktion dann auf einem ihrer Server bereit, die mit einer Ausführungsumgebung vorkonfiguriert sind, in der die Funktion ausgeführt werden kann.
  4. Es führt die Funktion aus und erfasst das Ergebnis.
  5. Das Ergebnis wird an den Client zurückgegeben.

Manchmal wird Serverless Computing als Function as a Service (FaaS) bezeichnet, da die Granularität des von Ihnen erstellten Codes eine Funktion ist . Die Plattform führt Ihre Funktion auf einem eigenen Server aus und koordiniert den Prozess zwischen Funktionsanforderungen und Funktionsantworten.

Nanoservices, Skalierbarkeit und Preis

Drei Dinge sind beim Serverless Computing wirklich wichtig: seine Nanoservice-Architektur; die Tatsache, dass es praktisch unendlich skalierbar ist; und das Preismodell, das mit dieser nahezu unendlichen Skalierbarkeit verbunden ist. Wir werden uns mit jedem dieser Faktoren befassen.

Nanoservices

Sie haben von Microservices gehört und kennen sich wahrscheinlich mit 12-Faktor-Anwendungen aus, aber serverlose Funktionen bringen das Paradigma, eine Komponente in ihre Bestandteile zu zerlegen, auf eine völlig neue Ebene. Der Begriff "Nanoservices" ist kein branchenweit anerkannter Begriff, aber die Idee ist einfach: Jeder Nanoservice sollte eine einzelne Aktion oder Verantwortung implementieren. Wenn Sie beispielsweise ein Widget erstellen möchten, ist der Erstellungsakt ein eigener Nanoservice. Wenn Sie ein Widget abrufen möchten, ist das Abrufen auch ein Nanoservice. und wenn Sie eine Bestellung für ein Widget aufgeben möchten, wäre diese Bestellung ein weiterer Nanoservice.

Mit einer Nanoservices-Architektur können Sie Ihre Anwendung auf einer sehr feinkörnigen Ebene definieren. Ähnlich wie bei der testgetriebenen Entwicklung (mit der Sie unerwünschte Nebenwirkungen vermeiden können, indem Sie Ihren Code auf der Ebene einzelner Tests schreiben) empfiehlt eine Nanoservices-Architektur, Ihre Anwendung anhand sehr feinkörniger und spezifischer Funktionen zu definieren. Dieser Ansatz erhöht die Klarheit darüber, was Sie erstellen, und reduziert unerwünschte Nebenwirkungen durch neuen Code.

Microservices vs Nanoservices

Microservices ermutigt uns, eine Anwendung in eine Sammlung von Diensten aufzuteilen, die jeweils eine bestimmte Aufgabe erfüllen. Die Herausforderung besteht darin, dass niemand den Umfang eines Mikrodienstes wirklich quantifiziert hat . Infolgedessen definieren wir Microservices als eine Sammlung verwandter Dienste, die alle mit demselben Datenmodell interagieren. Wenn Sie über Funktionen auf niedriger Ebene verfügen, die mit einem bestimmten Datenmodell interagieren, sollte die Funktionalität konzeptionell in einen der zugehörigen Dienste integriert werden. Interaktionen auf hoher Ebene sollten den Dienst aufrufen, anstatt die Datenbank direkt abzufragen.

Im Serverless Computing wird derzeit diskutiert, ob Lambda-Funktionen auf der Ebene von Microservices oder Nanoservices aufgebaut werden sollen. Die gute Nachricht ist, dass Sie Ihre Funktionen ziemlich einfach mit beiden Granularitäten erstellen können, aber eine Microservices-Strategie erfordert ein wenig zusätzliche Routing-Logik in Ihrem Anforderungshandler.

Aus gestalterischer Sicht sollten serverlose Anwendungen sehr gut definiert und sauber sein. Aus Sicht der Bereitstellung müssen Sie erheblich mehr Bereitstellungen verwalten, aber Sie können auch neue Versionen Ihrer Funktionen einzeln bereitstellen, ohne andere Funktionen zu beeinträchtigen. Serverless Computing eignet sich besonders gut für die Entwicklung in großen Teams, wo es den Entwicklungsprozess vereinfachen und den Code weniger fehleranfällig machen kann.

Skalierbarkeit

Serverlose Computerplattformen führen nicht nur ein neues Architekturparadigma ein, sondern bieten auch praktisch unbegrenzte Skalierbarkeit. Ich sage "praktisch", weil es so etwas nicht wirklich gibtunendliche Skalierbarkeit. Für alle praktischen Zwecke können Serverless-Computing-Anbieter wie Amazon jedoch mehr Last bewältigen, als Sie möglicherweise auf sie werfen könnten. Wenn Sie die Skalierung Ihrer eigenen Server (oder Cloud-basierten virtuellen Maschinen) verwalten möchten, um die gestiegene Nachfrage zu befriedigen, müssen Sie die Nutzung überwachen, ermitteln, wann mehr Server gestartet werden müssen, und Ihrem Cluster zum richtigen Zeitpunkt weitere Server hinzufügen. Wenn die Nachfrage sinkt, müssen Sie ebenfalls manuell verkleinern. Mit Serverless Computing teilen Sie Ihrer Serverless Computing-Plattform die maximale Anzahl gleichzeitiger Funktionsanforderungen mit, die Sie ausführen möchten, und die Plattform übernimmt die Skalierung für Sie.

Preisgestaltung

Finally, the serverless computing pricing model allows you to scale your cloud bill based on usage. When you have light usage, your bill will be low (or nil if you stay in the free range). Of course, your bill will increase with usage, but hopefully you will also have new revenue to support your higher cloud bill. For contrast, if you were to manage your own servers, you would have to pay a base cost to run the minimum number of servers required. As usage increased, you would scale up in increments of entire servers, rather than increments of individual function calls. The serverless computing pricing model is directly proportional to your usage.

AWS Lambda for serverless computing

AWS Lambda ist eine serverlose Computerplattform, die auf Amazon Web Services-Plattformen wie EC2 und S3 implementiert ist. AWS Lambda verschlüsselt und speichert Ihren Code in S3. Wenn eine Funktion zum Ausführen aufgefordert wird, erstellt sie anhand Ihrer Laufzeitspezifikationen einen "Container", stellt ihn auf einer der EC2-Instanzen in ihrer Rechenfarm bereit und führt diese Funktion aus. Der Prozess ist in Abbildung 2 dargestellt.

Steven Haines

When you create a Lambda function, you configure it in AWS Lambda, specifying things like the runtime environment (we'll use Java 8 for this article), how much memory to allocate to it, identity and access management roles, and the method to execute. AWS Lambda uses your configuration to setup a container and deploy the container to an EC2 instance. It then executes the method that you've specified, in the order of package, class, and method.

At the time of this writing, you can build Lambda functions in Node, Java, Python, and most recently, C#. For the purposes of this article we will use Java.

What is a Lambda function?

When you write code designed to run in AWS Lambda, you are writing functions. The term functions comes from functional programming, which originated in lambda calculus. The basic idea is to compose an application as a collection of functions, which are methods that accept arguments, compute a result, and have no unwanted side-effects. Functional programming takes a mathematical approach to writing code that can be proven to be correct. While it's good to keep functional programming in mind when you are writing code for AWS Lambda, all you really need to understand is that the function is a single-method entry-point that accepts an input object and returns an output object.

Serverless execution modes

While Lambda functions can run synchronously, as described above, they can also run asynchronously and in response to events. For example, you could configure a Lambda to run whenever a file was uploaded to an S3 bucket. This configuration is sometimes used for image or video processing: when a new image is uploaded to an S3 bucket, a Lambda function is invoked with a reference to the image to process it.

I worked with a very large company that leveraged this solution for photographers covering a marathon. The photographers were on the course taking photographs. Once their memory cards were full, they loaded the images onto a laptop and uploaded the files to S3. As images were uploaded, Lambda functions were executed to resize, watermark, and add a reference for each image to its runner in the database.

All of this would take a lot of work to accomplish manually, but in this case the work not only processed faster because of AWS Lambda's horizontal scalability, but also seamlessly scaled up and back down, thus optimizing the company's cloud bill.

In addition to responding to files uploaded to S3, lambdas can be triggered by other sources, such as records being inserted into a DynamoDB database and analytic information streaming from Amazon Kinesis. We'll look at an example featuring DynamoDB in Part 2.

AWS Lambda functions in Java

Now that you know a little bit about serverless computing and AWS Lambda, I'lll walk you through building an AWS Lambda function in Java. 

download Holen Sie sich den Code Quellcode für die Beispielanwendung für dieses Tutorial "Serverless Computing mit AWS Lambda". Erstellt von Steven Haines für JavaWorld.

Implementierung von Lambda-Funktionen

Sie können eine Lambda-Funktion auf zwei Arten schreiben:

  • Die Funktion kann einen Eingabestream an den Client empfangen und in einen Ausgabestream zurück an den Client schreiben.
  • Die Funktion kann eine vordefinierte Schnittstelle verwenden. In diesem Fall deserialisiert AWS Lambda den Eingabestream automatisch an ein Objekt, übergibt ihn an Ihre Funktion und serialisiert die Antwort Ihrer Funktion, bevor sie an den Client zurückgegeben wird.

Der einfachste Weg, eine AWS Lambda-Funktion zu implementieren, ist die Verwendung einer vordefinierten Schnittstelle. Für Java müssen Sie zuerst die folgende AWS Lambda-Kernbibliothek in Ihr Projekt aufnehmen (beachten Sie, dass in diesem Beispiel Maven verwendet wird):

 com.amazonaws aws-lambda-java-core 1.1.0  

Next, have your class implement the following interface:

Listing 1. RequestHandler.java

 public interface RequestHandler { /** * Handles a Lambda function request * @param input The Lambda function input * @param context The Lambda execution environment context object. * @return The Lambda function output */ public O handleRequest(I input, Context context); } 

The RequestHandler interface defines a single method: handleRequest(), which is passed an input object and a Context object, and returns an output object. For example, if you were to define a Request class and a Response class, you could implement your lambda as follows:

 public class MyHandler implements RequestHandler { public Response handleRequest(Request request, Context context) { ... } } 

Alternatively, if you wanted to bypass the predefined interface, you could manually handle the InputStream and OutputStream yourself, by implementing a method with the following signature:

 public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { ... } 

The Context object provides information about your function and the environment in which it is running, such as the function name, its memory limit, its logger, and the amount of time remaining, in milliseconds, that the function has to complete before AWS Lambda kills it.