2017-06-28 4 views
1

Ich möchte nur sehen, ob dies der beste Weg zur Lösung dieses Problems ist.DynamoDB-Index mit niedriger Verteilung abfragen

Szenario

Wir bauen ein Online-Managerspiel Sport. In unserem Spiel gibt es Teams, und die Mannschaften spielen sich gegenseitig in sogenannten "Fixtures".

Zu Beginn jeder Saison werden die Spielpläne für die Saison erstellt und in eine Tabelle eingegeben, z. Ein Fixture Item kann Team 1 gegen Team 2, 1. Dezember, 19 Uhr angeben.

Das Gameplay für jedes Gerät wird zum Startzeitpunkt des Geräts erstellt, um Änderungen zu berücksichtigen, die die Teambesitzer bis zu diesem Zeitpunkt gemacht haben.

Wir haben einen Scheduler, der die Tabelle für Fixtures überprüfen muss, die: 1) nicht ausgeführt wurden und 2) deren Startdatum jetzt <= ist. Wir fügen "weniger als" hinzu, so dass wir im Falle von Systemproblemen oder Ausfallzeiten alle Übereinstimmungen nachholen können, die möglicherweise noch auf die Ausführung warten.

Problem

Wie wir eine große DynamoDB Tabelle für die Lampen suchen haben, die noch nicht ausgeführt haben, und das Datum, dessen Start ist jetzt oder früher.

Aktuelle Lösung

Der aktuelle Plan ist ein boolean Feld HasNotRun anfänglich auf true, zusammen mit dem Date Feld mit dem Namen zu erstellen. Wir erstellen dann einen spärlichen globalen sekundären Index mit dem Feld HasNotRun als Partitionsschlüssel, um alle Fixtures noch nicht auszuführen, und verwenden Date als sortierten Bereichsschlüssel und filtern danach. Sobald die Übereinstimmung ausgeführt wird, wird das Feld HasNotRun aus dem Element entfernt, und somit wird das Element aus dem Sparse-Index entfernt.

Da jedoch das Feld HasNotRun immer ein einzelner Wert von true ist, befinden sich alle Elemente in diesem Index immer in einer einzigen Partition, was nicht die beste Methode zur Verwendung von DynamoDB zu sein scheint.

Ein besserer Weg?

Wenn es einen besseren Weg gibt, dieses Problem zu lösen, würden wir es gerne hören. Wir wissen, dass es da draußen ist!

Antwort

0

Ihre Lösungen sind eigentlich ziemlich gut. Einen einzigen Schlüssel zu haben ist nicht so schlimm wie er klingt, weil der gesamte Durchsatz auf diesen einzelnen Schlüssel geht. Probleme treten auf, wenn Sie mehr als einen Schlüssel mit ungleichmäßiger Abfrageverteilung haben. Mit nur einem Schlüssel werden Sie dieses Problem nicht haben. Es kann jedoch verschiedene Arten von Problemen verursachen, wenn Sie einen sehr hohen Durchsatz erwarten: Wenn die Gesamtzahl der Elemente in diesem GSI unter 10 GB liegt, werden Sie durch Durchsatzlimits für einzelne Partitionen begrenzt (3000RCU und 1000WCU). Wenn es über 10 GB kommt, wird die zweite Partition erstellt und der maximale Durchsatz wird auf 6000/2000 und so weiter begrenzt.

Eine Möglichkeit, Ihre Lösung zu verbessern, besteht darin, Shards anstelle des booleschen Werts zu verwenden. Anstatt den Wert "wahr" zuzuweisen, weisen Sie eine Zufallszahl von 1 bis N zu (N hängt von Ihren Skalierungsplänen ab und kann auch dynamisch angepasst werden). Ihre Abfrage muss nun N Abfragen für jeden Schlüssel durchführen (Sie können dies parallel tun) und dann Ergebnisse zusammenführen.Diese Lösung leidet nicht unter dem im ersten Absatz erwähnten Problem.

Verwandte Themen