In diesem Blog haben wir gesehen, wie man DynamoDB verwendet, um Daten für einen kurzen Zeitraum zu speichern. Dank der Flexibilität von DynamoDB können wir so gut wie jeden Text mit einem Schlüssel speichern und effizient abrufen. Dynamo ist natürlich nicht die einzige Lösung. Amazon bietet auch
Ich habe DynamoDB verwendet, um kleinen JSON-formatierten Text zu speichern, der über einen Schlüssel abgerufen werden kann. Dieser Blog zeigt, wie das funktioniert. Diese Lösung ist wirklich einfach zu implementieren. In dem Code, der dem Blog beiliegt, finden Sie CDK-Skripte, um die Infrastruktur für den Cache einzurichten.
Die Einrichtung der Infrastruktur ist also ganz einfach. Der Wartungsaufwand ist gleich null, denn Dynamo ist ein von AWS verwalteter Service.
Ich habe nie versucht, die Leistungsgrenzen zu erreichen, aber für meine Anwendungsfälle waren alle Standardeinstellungen in Ordnung.
Es gibt jedoch einen Vorbehalt, denn DynamoDB hat eine maximale Datensatzgröße von 400 KB. Diese Begrenzung machte die Datenbank in einem aktuellen Anwendungsfall unpraktisch, bei dem wir ein großes JSON-Dokument gespeichert haben, das aus einem Content Management System abgerufen wurde. Dieses Dokument wurde beim Start an eine App gesendet. In diesem Fall erfolgte das Laden der Daten im Hintergrund, so dass der Benutzer davon nichts mitbekam. Wegen der Größenbeschränkung von 400 KB wäre Dynamo weniger geeignet gewesen.
Die Lösung, die wir für den obigen Anwendungsfall gewählt haben, war Redis, abstrahiert durch ElastiCache. Das Abrufen der Daten ist denkbar einfach:
const data = await this.redisClient.get('data');
Erstellen Sie den Cache mit CDK:
redis_cluster = elasticache.CfnCacheCluster(
scope=self,
id="redis_cache_cluster",
engine="redis",
cache_node_type="cache.t3.small",
num_cache_nodes=1,
cache_subnet_group_name=...,
vpc_security_group_ids=[...],
)
Wir müssen überlegen, wie wir die Daten über den Cluster verteilen, wie viele Replikate benötigt werden und welcher Knotentyp verwendet werden soll.
Bei Dynamo würde dies, wenn die Größe des Elements data mehr als 400K beträgt, eine Schleife erfordern, um die Daten in mehreren Sätzen zu erhalten, die dann verkettet oder in Stapeln an den Client gesendet werden müssten. Die Leistung würde definitiv darunter leiden:
import boto3
if __name__ == '__main__':
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('Cache')
cache_data = []
batch = table.scan()
data = batch['Items']
cache_data.append(data)
while 'LastEvaluatedKey' in batch:
batch = table.scan(ExclusiveStartKey=batch['LastEvaluatedKey'])
data = batch['Items']
cache_data.append(data)
Und die Erstellung einer Dynamo-Tabelle:
const cacheTable = new dynamoDB.Table(this, 'CacheTable', {
tableName: 'Cache',
partitionKey: {
name: 'id',
type: dynamoDB.AttributeType.STRING,
},
billingMode: dynamoDB.BillingMode.PROVISIONED,
timeToLiveAttribute: 'ttl',
removalPolicy: cdk.RemovalPolicy.DESTROY,
});
Ein weiterer Punkt, den Sie berücksichtigen müssen, ist die Zeit, die für die Bereitstellung der Infrastruktur benötigt wird. Während der CDK-Code für Dynamo nur wenige Minuten in Anspruch nimmt, kann die Einrichtung eines ElastiCache-Clusters mit drei Knoten 15 Minuten dauern. Das spielt keine Rolle, wenn die Infrastruktur stabil ist und einem klassischen Entwicklungs-/Test-/Produktionsaufbau folgt. Es kann ein wenig dauern, bis die Infrastruktur zum Laufen gebracht wird, aber sobald sie fertig ist, kostet es nichts mehr, eine neue Anwendungsversion auszurollen.
Eine der großartigen Eigenschaften einer Cloud-Infrastruktur wie AWS ist jedoch, wie einfach es ist, einen Stack für eine Zweigstelle bereitzustellen oder eine Kopie für einen bestimmten Anwendungsfall zu erstellen, z.B. eine Testumgebung, um die Ursache eines Fehlers zu untersuchen. Bei kurzlebigen Infrastrukturen macht sich die Anlaufzeit für einen ElastiCache-Cluster bemerkbar. Beachten Sie auch die Eigenschaft engine_version: Sie werden irgendwann ein Upgrade durchführen müssen und zwar immer wieder. Dynamo würde automatisch aktualisiert werden.
Auch die Kosten könnten ein Thema sein. Da die Kosten für Dynamo pro Nutzung berechnet werden (Sie zahlen nur für die Bearbeitung und den Abruf von Daten, nicht für die Speicherung), ist die Speicherung von Daten im Grunde kostenlos. Dies ist bei Redis nicht der Fall, da es EC2-Instanzen verwendet. Ich glaube nicht, dass es einfach ist, zu entscheiden, welche Lösung günstiger ist. Dieser Dynamo-Preisrechner könnte Ihnen helfen.
Und schließlich, wenn Dynamo Ihre primäre Datenbank ist, können Sie es auch als Cache verwenden, und sei es nur, um die Anzahl der Tools zu minimieren, die Sie in Ihrem Team verwalten müssen.
Anmerkungen:
- DAX mag billiger und einfacher zu benutzen sein als einfache Dynamo-Tabellen, aber ich habe es noch nicht ausprobiert.
Schlussfolgerungen
Die Kompromisse bei der Wahl zwischen Dynamo und Redis wären also folgende:
- Benutzerfreundlichkeit
- Startzeit
- Wartungsaufwand
- Wollen Sie noch eine weitere Datenbank?
Wie immer, es kommt darauf an.
Verfasst von

Jan Vermeir
Developing software and infrastructure in teams, doing whatever it takes to get stable, safe and efficient systems in production.
Unsere Ideen
Weitere Blogs
Contact



