2012-03-25 4 views
2

Ich baue ein einfaches "Spiel gegen einen zufälligen Gegner" Back-End mit Goole App Engine. Bisher füge ich jeden Benutzer, der im Datastore in eine "Tabelle" spielen möchte, hinzu. Sobald mehr als ein Spieler im Datastore ist, kann ich mit dem Abgleich beginnen.Google App Engine - Cron oder Aufgabenwarteschlange?

Die Schedule Tasks with Cron sah vielversprechend für diese Arbeit, bis ich sah, dass die niedrigste Auflösung scheint genau zu sein. Wenn sich viele Spieler anmelden, möchte ich, dass sie schnell aufeinander abgestimmt sind und nicht eine ganze Minute warten müssen (schlimmster Fall).

Ich dachte über das Servlet, das die "Spiel gegen zufällige Gegner" Anfrage POST an eine Task-Warteschlange, die das Match Making würde, aber ich glaube, dies wird zu einer Menge Streit beim Lesen aus dem Datastore und Löschen führen die Einträge aus der "zufälligen" Tabelle, nachdem sie abgeglichen wurden?

Grundsätzlich möchte ich einen einzelnen Arbeiter, der das Matching tun wird, und ich möchte diesem Arbeiter von Zeit zu Zeit signalisieren, dass jetzt ist eine gute Zeit, um zu versuchen, Gegner zu entsprechen.

Irgendwelche Vorschläge, was hier die richtige Vorgehensweise wäre?

Antwort

2

können Sie garantieren einen exklusiven Zugriff über Transaktionen:

  1. eine Anfrage per REST spielen Empfangen. Überprüfen Sie (innerhalb einer Transaktion), ob eine Anfrage in der Datenbank vorhanden ist.

  2. Wenn dies der Fall ist, benachrichtigen Sie beide Benutzer, um die Wiedergabe zu starten und die Anforderung (transaktional) aus der Datenbank zu löschen.

  3. Wenn nicht, fügen Sie es zur Datenbank hinzu und warten Sie auf die nächste Anfrage.

Update:

Alternativelly können Sie erreichen, was Sie über pull queue benötigen. Gleiches Szenario wie oben, nur anstelle des Datenspeichers würden Sie prüfen, ob sich eine Aufgabe in der Pull-Warteschlange befindet, ob eine neue Aufgabe vorhanden ist oder eine neue erstellen, falls keine vorhanden ist.

+1

Ja, aber mit einer großen Menge an Verkehr wird dies wahrscheinlich zu einer Menge Streit führen. Ich kann nicht sehen, dass ich mehr als einen "Arbeiter" brauche, der das tatsächliche Matching macht. Ich weiß nicht, ob es möglich ist, einen einzelnen Arbeiter ohne Cron-Jobs zu erstellen. Cron hat die problematische Auflösung, obwohl ich nicht versucht habe, es auf "0,1 Minuten" zu setzen. – TommyN

+0

Hauptproblem - es gibt keine "Arbeiter" in GAE (wie in laufenden Thread- und Ausführungsaufgaben). Der nächste, den Sie erhalten können, ist Task Queue. In Ihrem Fall Pull Queue. Siehe aktualisierte Antwort. –

+0

Sie können hier auch ein Backend verwenden - es muss jedoch keine Konkurrenzsituation bestehen, solange jede ausstehende Spielanforderung in ihrer eigenen Entitätsgruppe ist. –

Verwandte Themen