2016-05-10 19 views
4

Ich erwäge, die Vorteile von spärlichen Indizes zu nutzen, wie im AWS guidelines beschrieben. In dem beschriebenen Beispiel -Dynamo DB: globaler sekundärer Index, spärlicher Index

... in der Tabelle GameScores könnten bestimmte Spieler einen bestimmten Erfolg für ein Spiel verdient haben - wie "Champ" - aber die meisten Spieler nicht. Anstatt die gesamte GameScores-Tabelle für Champs zu durchsuchen, könnten Sie einen globalen sekundären Index mit einem Partitionsschlüssel von Champ und einem Sortierschlüssel von UserId erstellen.

Meine Frage ist: Was passiert, wenn die Anzahl der Champs sehr groß wird? Ich nehme an, dass die "Champ" -Partition sehr groß wird und Sie eine ungleichmäßige Lastverteilung erfahren würden. Um eine gleichmäßige Lastverteilung zu erhalten, müsste ich den "Champ" -Wert durch Zufallsauswahl (effektiv) über n Shards, z. Champ.0, Champ.1 ... Champ.99?

Gibt es alternativ ein anderes Zugriffsmuster, das beim Abrufen von Entitäten mit einem bestimmten Attribut verwendet werden kann, das im Laufe der Zeit stark anwachsen kann?

Antwort

1

das ist genau die Lösung, die Sie brauchen (Champ.0, Champ.1 ... Champ.N)

N sollte sein [erwartet Partitionen für diesen Index + einige Wachstumslücke] (wenn Sie für hohe erwarten laden, oder viele 'champs', dann können Sie N = 200 wählen (für eine gute Hashverteilung über Partitionen). Ich empfehle, dass N modulo auf userId sein wird. (Dies kann Ihnen helfen, einige Manipulationen durch userId zu machen.)

Wir verwenden diese Lösung auch, wenn Ihr Hash-Schlüssel Boolean ist (in dynamodb können Sie boolean als String darstellen), so dass in diesem Fall der Hash "true" ist. 0 "," true.1 "...." true.N "und das gleiche für" false ".