2017-12-17 3 views
0

Ich bin neu in AWS und arbeite an einer Serverless-Anwendung, bei der eine Funktion eine große Datenmenge lesen muss. Niemals wird ein einzelnes Element aus der Tabelle gelesen, aber alle Elemente werden routinemäßig durch eine Zeitplanfunktion aktualisiert.Empfohlene Methode zum Lesen einer ganzen Tabelle (Lambda, DynamoDB/S3)

Was ist Ihre Empfehlung für den effizientesten Umgang mit diesem Szenario? Meine aktuelle Implementierung verwendet den scan-Vorgang in einer DynamoDB-Tabelle, aber mit meiner begrenzten Erfahrung bin ich nicht sicher, ob dies in der Produktion performant sein wird. Wäre es besser, die Daten vielleicht als eine JSON-Datei auf S3 zu speichern? Und wenn ja, wäre es so einfach, die Werte mit einer Zeitplanfunktion zu aktualisieren?

Danke für Ihre Zeit.

PS: eine Vorstellung von der Größe der Datenbank zu geben, wird es ~ 1500 Elemente sein, die jeweils eine Reihe von bis zu ~ 100 Saiten

Antwort

2

Hier ist, wie ich tun würde enthalten:

Updates Zeitplan:

Lambda (behandeln Planänderungen) -> DynamoDB -> DynamoDBStream -> Lambda (Lesen Sie, wenn vorhanden, auf Änderungen anwenden auf alle Objekte und speichern zu einzelnes Objekt in S3)

Lesen Zeitplan:

Mit Lambda Lesen Sie das einzelne Objekt von S3 und bedienen Sie alle Pläne oder einzelne Zeitplan abhängig von der Anfrage. Sie können vor dem nächsten Lesen prüfen, ob das Objekt geändert wurde oder nicht, so dass Sie nicht jedes Mal von S3 lesen und nur aus dem Speicher bedienen müssen.

Skalierbarkeit:

Wenn Sie skalieren möchten, müssen Sie die Objekte auf bestimmte Größe spalten, so dass Sie nicht alle Objekte 3GB geladen werden mehr als die Speichergröße (Lambda-Prozess Speichergröße)

Hoffnung das hilft.

EDIT1:

Wenn Sie Ihre Portion Lambda Kaltstart, laden Sie das Objekt aus s3 ersten und danach können Sie s3 für eine aktualisierte Objekt (nach bestimmten Zeitintervall oder eine bestimmte Anzahl von Anfragen) überprüfen mit since modified date Attribut.

Sie können auch diese Daten zu Lambda-Speicher und dienen aus dem Speicher bis das Objekt aktualisiert wird.

+0

Ah das ist eine gute Idee, beide auf diese Weise zu erhalten! Vielen Dank! In Bezug auf die Bereitstellung aus dem Speicher gibt es eine besondere Methode, um sicherzustellen, dass dies geschieht? Ich dachte, ich müsste jedes Mal von S3 "holen", hat Lambda eine Art Caching-System? – sherlock

+1

Bearbeitete die Antwort, um Kaltstartlesevorgänge unterzubringen. – Kannaiyan

+0

Danke für Ihre Klarstellung! Die Bereitstellung aus dem Speicher wäre ideal, da die Quelldaten zuverlässig nur einmal am Tag aktualisiert werden müssen. Ich kann jedoch keine Dokumentation finden, die erklärt, wie der Lambda-Speicher funktioniert. Wenn ich S3.getObject() verwende, speichert dies automatisch die Daten im Speicher? Wenn nicht, wäre Ihre Hilfe, um zu verstehen, wie Lambda Speicher funktioniert, wirklich geschätzt. – sherlock

2

Es hängt von der Größe jedes Einzelteils ab, aber wie?

allererst DynamoDB oder S3 verwenden Sie für zwei Dienste zu bezahlen (in Ihrem Fall *):

1- Anfrage pro Monat

2- Lagerung pro Monat

Wenn Sie kleine Artikel der erste Fall wird bis zu 577 mal billiger, wenn Sie Artikel von DynamoDB anstelle von S3 lesen

Wie: $ 0.01 pro 1.000 Anfragen für S3 im Vergleich zu 5,2 Millionen Lesevorgängen (bis zu 4 KB) pro Monat für DynamoDB. Plus sollten Sie $ 0,01 pro GB für Datenabruf in S3 zahlen, die zu diesem Preis addiert werden sollte. Ihre Schreibvorgänge in S3 sind jedoch kostenlos, während Sie für jeden Schreibvorgang in Ihre DynamoDB bezahlen müssen (was fast viermal teurer ist als das Lesen).

Wenn jedoch Ihre Artikel so viele RCUs pro Lese erfordern, wäre S3 in diesem Fall vielleicht billiger. Die Speicherkosten sind zwar geringer, aber Sie sollten sehen, wie groß Ihre Daten sind, da Sie für S3 maximal 0,023 US-Dollar pro GB bezahlen, während Sie 0,25 US-Dollar pro GB pro Monat zahlen, was fast 10-mal teurer ist .

Fazit: Wenn Sie so viele Anfrage und Ihre Elemente sind kleiner sein einfacheres und noch geradeaus DynamoDB zu verwenden, da Sie keine der Abfrage-Funktionen geben, die Sie DynamoDB haben mit der Sie eindeutig wird nicht, wenn Sie S3 verwenden. Andernfalls können Sie einen Zeiger auf die in S3 in DynamoDB gespeicherten Objekte beibehalten.

(*) Die Kosten, die Sie für Tags in S3 oder Indizes in DynamoDB bezahlen, sind weitere Faktoren, die berücksichtigt werden müssen, wenn Sie sie verwenden müssen.

+0

Hallo @mok, danke für deine Antwort! Die Gesamtmenge der Daten wird nicht groß sein .. höchstens ein paar MB. Es wird viele Anfragen an die Datenbank geben - wissen Sie, ob ein "Scan" (das Abrufen der gesamten Tabelle) gleichbedeutend ist mit "einem einzigen Produkt in Bezug auf die Kosten"? Weil der "Scan" eine einzige Anfrage ist? Wenn ja, kann ich bei DynamoDB bleiben, um die Benutzerfreundlichkeit zu erhöhen, wie Sie es erwähnt haben. Danke noch einmal. – sherlock

+0

Ich habe einige Nachforschungen angestellt und festgestellt, dass ein einzelner "Scan" bis zu 128 Leseoperationen für jeden MB an Daten verwenden kann. Wenn man bedenkt, dass bei einem plötzlichen Anstieg des Datenverkehrs, der 1-2 MB Daten pro Nutzer abfragt, denke ich, dass das teuer werden könnte. Aus diesem Grund lehne ich mich zurück, um die Daten als json zu speichern. Lassen Sie es mich wissen, wenn Sie denken, dass ich das Preisschema missverstanden habe. Danke – sherlock

+1

@sherlock Jeder Scan verarbeitet jedes Element einzeln, so dass ein Scan mehr als eine RCU verbrauchen kann (und vielleicht auch wird). Also sollten Sie immer noch die Größe Ihrer Artikel und die Anzahl der Anfragen überprüfen. – mok

Verwandte Themen