2016-07-17 20 views
0

Ich möchte ein Spiel erstellen, das Azure Table Storage für die Bestenliste verwendet.Verwenden von Score + GUID Als RowKey für ein Spiel mit Azure-Tabellenspeicher

Es wurde empfohlen, dass ich, wenn ich möchte, dass Azure Table Storage mir eine sortierte/seitenweise Liste präsentiert, den Score als RowKey für meine Tabellenentität verwenden muss. (Ich werde einen Spieler GUID anzuhängen, um sicherzustellen, dass jede erzeugte RowKey einzigartig ist.)

Hier sind meine Bedenken mit dieser Empfehlung:

  • Andere Spieler können einen Spieler-Score (wie es abnehmend) , so dass Nebenläufigkeitsfragen in Betracht gezogen werden können. Wenn ein Spielclient versucht, die Punktzahl eines Spielers zu aktualisieren, und ich die vorherige Punktzahl verwende, um nach der Tabellenentität zu suchen, kann ich diese Zeile möglicherweise nicht finden, wenn ein anderer Client sie bereits aktualisiert hat.

  • Wenn Sie ein anderes Feld verwenden, um nach der Tabellenentität (Partition + Attribut) zu suchen, z. B. nach dem Spielernamen, wird die Abfrage nicht optimal sein.

Welches ist ein besserer Ansatz für Zeilenaktualisierungen? Soll ich Sperrtechniken verwenden und nach RowKey suchen? Oder suche ich mit dem Benutzernamen?

Oder sollte ich die Idee, Score als RowKey zu verwenden und die Sortierung im Speicher nach dem Abrufen einer vollständigen Tabelle, um eine Seite in der Bestenliste anzuzeigen, aufgeben?

Nehmen wir einmal an, dass die Punktzahl Updates und Leaderboard Viewing gleich häufig sind.

+0

Ich endete mit Partition + Attribut Abfrage als erste Sache in einem Wiederholungszyklus zu tun, dann die Updates innerhalb dieses Blocks. Wenn es aus irgendeinem Grund fehlschlägt, versucht es, die Entität mit derselben Abfrage erneut abzurufen. Es tritt nach einer Anzahl von Wiederholungen aus. Es ist nicht effizient, aber es ist die einzige Möglichkeit, die ich mir vorstellen kann, ohne auf Singleton-Lösungen wie Azure Queue + einen einzigen fortlaufenden Web-Job zurückgreifen zu müssen, der mindestens eine Basic-Instanz benötigt. –

Antwort

1

Es ist nicht angebracht, RowKey oder PartitionKey zu nutzen, um Ihre Anforderung zu erfüllen. Die Kombination aus Partitionsschlüssel und Zeilenschlüssel ist die Identität der Entität im Tabellenspeicher. Sobald Sie sie in der Einfügeoperation definieren, können Sie nie wieder aktualisieren. Ausführliche Informationen finden Sie im Thread auf MSDN https://social.msdn.microsoft.com/Forums/azure/en-US/7ad92641-3b0b-4faa-989f-3506fab47325/can-we-update-partition-key-or-row-key-in-azure-table-storage?forum=windowsazuredata.

Zusätzlich ist, wie die Beschreibung bei https://azure.microsoft.com/en-us/documentation/articles/storage-table-design-guide/#sorting-data-in-the-table-service:

Die Tabelle Dienst gibt Entitäten aufsteigend sortiert auf Basis von PartitionKey und dann durch RowKey.

So ist der Azure Table Storage in Ihrem Szenario nicht so geeignet. Sie können Azure SQL Database nutzen, um Ihre Anforderung zu erfüllen.

+0

Ich bin mir bewusst, dass ich keine Partition oder Zeilenschlüssel aktualisieren kann, und dass ich den Datensatz zerstören und einen neuen einfügen muss, wenn ich beides ändern muss. Ich habe diese Einschränkungen mit Azure Table Storage aus Kosten- und Skalierbarkeitsgründen behoben. –

+1

Cool, könnten Sie bitte Ihre Idee als Ihre Antwort teilen, was anderen Gemeinschaften im ähnlichen Szenario zugute kommen wird. –

+0

Entschuldigung, ich meinte "Ich habe gewählt, mit diesen Einschränkungen mit Azure Table Storage aus Gründen der Kosten- und Skalierbarkeit (anstelle von Azure SQL) zu arbeiten." –