Sie sind auf dem richtigen Weg, Sie sollten wirklich aufpassen, wie Sie mit Schreibvorgängen umgehen, während Sie täglich einen Importauftrag ausführen. Vermeiden Sie es auch, Indizes unnötigerweise hinzuzufügen, da sie Ihre Schreibvorgänge nur vervielfachen.
Die Verwendung von customer_id
als Hash-Schlüssel und item_no
als Bereichsschlüssel bietet die beste Option nicht nur zum Abfragen, sondern auch zum Hochladen Ihrer Daten.
Wie Sie bereits erwähnt haben, wäre die Randomisierung Ihrer Kunden-IDs sehr hilfreich, um die Verwendung von Ressourcen zu optimieren und die Möglichkeit einer heißen Partition zu vermeiden. In Ihrem Fall würde ich das genaue Beispiel in der DynamoDB Dokumentation enthalten folgen:
[...] Eine Möglichkeit, den Schreibdurchsatz dieser Anwendung zu erhöhen würde die Schreibvorgänge über mehrere Teilungsschlüsselwerte randomisieren sein. Wählen Sie eine Zufallszahl aus einem festen Satz (beispielsweise 1 bis 200) und verketten es als Suffix [...]
Also, wenn Sie Ihre Kundeninformationen schreiben nur zufällig mit dem Suffix zuweisen zu Ihrem Kunden-IDs, vergewissern Sie sich, dass Sie sie gleichmäßig verteilen (z. B. CustomerXYZ.1, CustomerXYZ.2, ..., CustomerXYZ.200).
Um alle Elemente zu lesen, die Sie benötigen, um alle Elemente für jedes Suffix zu erhalten. Beispielsweise würden Sie zuerst eine Abfrageanforderung für den Partitionsschlüsselwert CustomerXYZ.1, dann eine weitere Abfrage für CustomerXYZ.2 usw. über CustomerXYZ.200 ausgeben. Da Sie den Suffixbereich (in diesem Fall 1 ... 200) kennen, müssen Sie nur die Datensätze abfragen, die jedes Suffix an die Kundennummer anhängen.
Jede Abfrage mit dem Hash-Schlüssel CustomerXYZ.n
sollte einen Satz von Elementen (angegeben durch den Bereichsschlüssel) von diesem bestimmten Kunden zurückgeben. Ihre Anwendung müsste die Ergebnisse aus allen Abfrageanforderungen zusammenführen.
Dies wird sicherlich Ihr Leben schwerer machen, die Aufzeichnungen zu lesen (in Bezug auf die zusätzlichen Anforderungen benötigt), aber die Vorteile der optimierten Durchsatz und Leistung wird sich auszahlen.Denken Sie daran, dass eine heiße Partition nicht nur Ihre Gesamtkosten erhöht, sondern sich auch drastisch auf Ihre Leistung auswirkt.
Wenn Sie einen gut gestalteten Partitionsschlüssel haben, werden Ihre Abfragen immer sehr schnell und mit minimalen Kosten zurückgegeben.
Stellen Sie außerdem sicher, dass Ihr Importauftrag keine nach Kunden gruppierten Schreibvorgänge ausführt. Anstatt beispielsweise alle Artikel eines bestimmten Kunden in Serie zu schreiben, sortieren Sie die Schreibvorgänge so, dass sie auf alle Kunden verteilt sind. Obwohl Ihre Kunden aufgrund des ID-Randomisierungsprozesses auf mehrere Partitionen verteilt werden, sollten Sie diese zusätzliche Sicherheitsmaßnahme ergreifen, um einen Schreibvorgang in einer einzelnen Partition zu verhindern. Details siehe unten:
Von ‚Write Aktivität verteilt Während Data Upload‘ der offiziellen DynamoDB Dokumentation:
voll Um alle der Durchsatzleistung zu nutzen, die für Ihre Tabellen bereitgestellt worden ist, müssen Sie Verteilen Sie Ihre Arbeitslast über Ihre Partition Schlüsselwerte. In diesem Fall können Sie möglicherweise nicht alle Ressourcen , die DynamoDB für Ihre Tabelle bereitgestellt hat, verwenden, indem Sie eine ungleiche Upload-Arbeit auf Elemente mit demselben Partitionsschlüssel-Wert richten. Sie können Ihre Upload-Arbeit verteilen, indem Sie zuerst einen Eintrag von jedem Partitionsschlüssel-Wert hochladen. Sie dann das Muster für den nächsten Satz von Sortierschlüssel Werte wiederholen für alle Elemente, bis Sie alle Daten laden [...]
Quelle: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GuidelinesForTables.html
Ich hoffe, das hilft. Grüße.
thx Mark, ich mag diese Lösung und werde nächste Woche einen Leistungstest machen. – Xaptor