AWS-Ressourcen mit Java erstellen und verwalten, Teil 3

DynamoDB-Zugriff über AWS SDK for Java

| Autor / Redakteur: Thomas Drilling / Stephan Augsten

Über die Eclipse-Umgebung lässt sich der Sample-Code für ein Java-DynamoDB-Projekt laden.
Über die Eclipse-Umgebung lässt sich der Sample-Code für ein Java-DynamoDB-Projekt laden. (Bild: Drilling / Eclipse)

Bei einem NoSQL-Service wie DynamoDB ist das Abfragen bzw. Lesen und Schreiben von Daten über die RestAPI ohnehin der Normalfall. Dementsprechend einfach gestaltet sich der Zugriff über das AWS SDK for Java.

Wir könnten das AWS SKD for Java an so ziemlich jedem AWS-Dienst demonstrieren. Nach S3 scheint uns aber besonders der Zugriff auf die verwaltete NoSQL-Datenbank DynamoDB für Programmierer von Interesse, da der programmatische Zugriff hier der Dominierende ist.

DynamoDB ist zudem der Parade-Datenspeicher für moderner Cloud-basierte Anwendungs-Architekturen. Schließlich bietet er Persistenz bei einer gleichbleibend niedrigen Latenz im Millisekunden-Bereich – selbst bei Zugriffraten von 100.000 IOPS und mehr.

Amazon DynamoDB ist ein vollständig verwalteter NoSQL-Datenbankservice, der es Entwicklern erlaubt, den Verwaltungsaufwand für Betrieb und Skalierung abzugeben. Sie müssen sich also nicht mehr um die Bereitstellung von Hardware, um deren Einrichtung und Konfiguration, die Replikation, das Patchen der Software oder um die Cluster-Skalierung sorgen.

DynamoDB verteilt die Daten und den Datenverkehr für die Tabellen automatisch auf eine ausreichende Anzahl von einzelnen Servern; je Anforderungen an Durchsatz und Speicherung kommen entsprechend viele „Partitionen“ zum Einsatz. Für eine konsistente und schnelle Leistung sorgen ausschließlich Solid-state Drives (SSDs). Zudem repliziert DynamoDB die Daten automatisch über mehrere Availability Zones in einer AWS-Region, was die integrierte Hochverfügbarkeit und Datenhaltbarkeit erklärt.

Illustration des Datenaustausches zwischen Anwendung, AWS SDK und DynamoDB.
Illustration des Datenaustausches zwischen Anwendung, AWS SDK und DynamoDB. (Bild: AWS Germany GmbH)

Wie alle NoSQL-Datenbanken ist DynamoDB mit Ausnahme des zwingend erforderlichen Partitions-Keys und eines optionalen Range-Keys schemalos. Das zugehörige SDK bzw. die korrespondierenden API-Calls sind aufgrund der einfachen Struktur relativ übersichtlich. Die vorangestellte Abbildung gibt einen Überblick über die DynamoDB-Anwendungsprogrammierung mit den AWS SDKs.

Was die APIs betrifft, differenziert AWS wie auch bei S3 zwischen der DynamoDB-API auf niedriger Ebene und einer High-Level-API. Generell stellt jedes AWS-SDK eine oder mehrere programmgesteuerte Schnittstellen für die Arbeit mit DynamoDB bereit. Diese reichen von einfachen Low-Level-DynamoDB-Wrapper bis hin zu objektorientierten Persistenz-Schichten.

Die verfügbaren Schnittstellen hängen davon ab, welche Programmiersprache und welches AWS SDK man konkret verwendet. Allerdings sind nicht alle Schnittstellen in allen AWS SDKs verfügbar. Die DynamoDB-Low-Level-API ist wie bei S3 eine Schnittstelle auf Protokoll-Ebene. Hier muss jede HTTP(S)-Anforderung ordnungsgemäß formatiert sein und eine gültige digitale Signatur aufweisen.

Die AWS-SDKs erstellen DynamoDB-Low-Level-API-Anforderungen in ihrem Namen und verarbeiten die Antworten von DynamoDB. Der Entwickler kann sich so auf seine Anwendungslogik konzentrieren und muss sich nicht mit Einzelheiten der unteren Ebene aufhalten.

DynamoDB-Wrapper

Um Entwicklers das Leben einfacher zu machen, stellen die AWS SDKs nur für Java und .NET zusätzliche Schnittstellen mit höheren Abstraktionsebenen bereit. Mit den High-Level-Schnittstellen für DynamoDB-Objekte können Entwickler in Ihrem Anwendungs-Code und Tabellen auch Beziehungen zwischen Objekte definieren, die die Daten dieser Objekte speichern.

Hat der Entwickler eine Zuweisung definiert, kann er einfache Objektmethoden wie „save“, „load“ oder „delete“ aufrufen. Die zugrunde liegenden DynamoDB-Low-Level-Operationen werden dann in Ihrem Namen automatisch aufgerufen, sodass Entwickler anstelle von datenbankorientiertem Code auch objektorientierten Quelltext schreiben können.

Das AWS SDK für Java stellt eine DynamoDBMapper-Klasse zur Verfügung. Mit dieser ist es möglich, DynamoDB-Tabellen Client-seitige Klassen zuzuordnen. Für das Verwenden von DynamoDBMapper definiert man die Beziehung zwischen Elementen in einer DynamoDB-Tabelle und den entsprechenden Objekt-Instanzen im Code.

Die DynamoDBMapper-Klasse ermöglicht den Zugriff auf Tabellen, das Ausführen von verschiedenen Create-, Read-, Update-, und Delete-Operationen (CRUD) und das Durchführen von Abfragen. Allerdings erlaubt die DynamoDBMapper-Klasse kein Erstellen, Aktualisieren oder Löschen von Tabellen. Hierzu bedarf es wiederrum der Low-Level-SDK für Java.

Beispiele mit dem Low-Level-SDK

Unterstützt werden derzeit die DynamoDB-Operationen:

BatchGetItem, BatchWriteItem, CreateBackup, CreateGlobalTable, CreateTable, DeleteBackup, DeleteItem, DeleteTable, DescribeBackup, DescribeContinuousBackups, DescribeGlobalTable, DescribeGlobalTableSettings, DescribeLimits, DescribeTable, DescribeTimeToLive, GetItem, ListBackups, ListGlobalTables, ListTables, ListTagsOfResource, PutItem, Query, RestoreTableFromBackup, RestoreTableToPointInTime, Scan, TagResource, TransactGetItems, TransactWriteItems, UntagResource, UpdateContinuousBackups, UpdateGlobalTable, UpdateGlobalTableSettings, UpdateItem, UpdateTable, UpdateTimeToLive

Die SDK-Funktionen sind also recht übersichtlich. Zum Erstellen einer Tabelle über die Java-SDK muss man zunächst eine Instanz der Klasse DynamoDB instanziieren. Danach instanziiert man einen reateTableRequest, um die Anforderungsinformationen bereitzustellen. Dabei kann man den gewünschten Tabellennamen, die Attribut-Definitionen, das Schlüsselschema und die Wunsch-Werte des bereitgestellten Durchsatzes (Provisioned IOPS) angeben.

AWS DynamoDB unterstützt zwar problemlos bis zu 150.000 IOPS und mehr, aus Kostengründen sollte man aber für erste Experimente nicht über jeweils fünf Read- und Write-Operationen hinausgehen. Ein Beispiel-Code-Fragment könnte z. B. so aussehen:

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();

DynamoDB dynamoDB = new DynamoDB(client);

List<AttributeDefinition> attributeDefinitions= new ArrayList<AttributeDefinition>();

attributeDefinitions.add(new AttributeDefinition().withAttributeName("Id").withAttributeType("N"));

List<KeySchemaElement> keySchema = new ArrayList<KeySchemaElement>();

keySchema.add(new KeySchemaElement().withAttributeName("Id").withKeyType(KeyType.HASH));

CreateTableRequest request = new CreateTableRequest()
   .withTableName(tableName)
   .withKeySchema(keySchema)
   .withAttributeDefinitions(attributeDefinitions)
   .withProvisionedThroughput(new ProvisionedThroughput()
   .withReadCapacityUnits(5L)
   .withWriteCapacityUnits(6L));

Table table = dynamoDB.createTable(request);

table.waitForActive();

Eclipse-AWS-Plugin

Über die Eclipse-Umgebung lässt sich der Sample-Code für ein Java-DynamoDB-Projekt laden.
Über die Eclipse-Umgebung lässt sich der Sample-Code für ein Java-DynamoDB-Projekt laden. (Bild: Drilling / Eclipse)

Für das weitere sukzessive Erforschen des Java-SDK für DynamoDB bietet sich erneut das in Teil zwei dieses Beitrages vorgestellte AWS-Eclipse-Toolkit an. Hat man dieses installiert und konfiguriert, kann man den Sample-Code für ein Java-DynamoDB-Projekt laden. Hierzu legt man wieder mit „File / New / AWS Java Project“ ein neues Projekt an und setzt im Abschnitt „AWS SDK Java Samples“ des Dialoges „Create an AWS Java project“ das Häkchen bei „Amazon DynamoDB Sample“.

Hier können wie z. B. leicht verifizieren, wie ein CreateTable-Request konkret aussieht. Das Beispiel erzeugt eine einfache Tabelle „tablename“ für das Speichern von Filmen mit einem simplen Partitions-Key „name“ mit einem provisionienierten Durchsatz von 1 Write-Capacity-Unit (WCU) und 1 Read-Capacity-Unit.

// Create a table with a primary hash key named 'name', which holds a string
   CreateTableRequest createTableRequest = new CreateTableRequest().withTableName(tableName)
   .withKeySchema(new KeySchemaElement().withAttributeName("name").withKeyType(KeyType.HASH))
   .withAttributeDefinitions(new AttributeDefinition().withAttributeName("name").withAttributeType(ScalarAttributeType.S))
   .withProvisionedThroughput(new ProvisionedThroughput().withReadCapacityUnits(1L).withWriteCapacityUnits(1L));

Im weiteren Verlauf des Samples wird das erfolgreiche Erstellen der Tabelle mit einem DescribeTableRequest kontrolliert und dann mit PutItemRequest und PutItemResult ein neues Item mit den Attributen ...

"Bill & Ted's Excellent Adventure",1989, "****", "James", "Sara"

... angelegt. Im weiteren Verlauf des Code-Beispiels kommt noch ein weiteres Item hinzu:

„Airplane", 1980, "*****", "James", "Billy Bob"

Ausgabe der DynamoDB-Datenbank.
Ausgabe der DynamoDB-Datenbank. (Bild: Drilling / Eclipse)

Anschließend lesen wie dir die komplette Tabelle mit einem bedingten Scan-Request, der alle Items erfasst, die nach 1985 erschienen sind.

Analog zum vorherigen Artikel können wir nun die Ecplise-IDE für Java mit dem AWS Toolkit for Eclipse konfigurieren und laden das Sample-AWS-Java-Projekt mit dem Beispiel-Code für Java.

Kommentare werden geladen....

Kommentar zu diesem Artikel

Der Kommentar wird durch einen Redakteur geprüft und in Kürze freigeschaltet.

Anonym mitdiskutieren oder einloggen Anmelden

Avatar
Zur Wahrung unserer Interessen speichern wir zusätzlich zu den o.g. Informationen die IP-Adresse. Dies dient ausschließlich dem Zweck, dass Sie als Urheber des Kommentars identifiziert werden können. Rechtliche Grundlage ist die Wahrung berechtigter Interessen gem. Art 6 Abs 1 lit. f) DSGVO.
  1. Avatar
    Avatar
    Bearbeitet von am
    Bearbeitet von am
    1. Avatar
      Avatar
      Bearbeitet von am
      Bearbeitet von am

Kommentare werden geladen....

Kommentar melden

Melden Sie diesen Kommentar, wenn dieser nicht den Richtlinien entspricht.

Kommentar Freigeben

Der untenstehende Text wird an den Kommentator gesendet, falls dieser eine Email-hinterlegt hat.

Freigabe entfernen

Der untenstehende Text wird an den Kommentator gesendet, falls dieser eine Email-hinterlegt hat.

copyright

Dieser Beitrag ist urheberrechtlich geschützt. Sie wollen ihn für Ihre Zwecke verwenden? Infos finden Sie unter www.mycontentfactory.de (ID: 45714768 / Datenbanken)