2

GAE バックエンドを使用して 2 プレイヤーのターン制ゲームを実装しようとしています。このゲームで最初に必要なのは、次のように動作する非常に単純なマッチメイキング システムです。

  1. ユーザー A がバックエンドに一致を要求します。バックエンドは彼に後で戻ってくるように言います
  2. ユーザー B がバックエンドに一致を要求します。彼はAとマッチします。
  3. ユーザー C がバックエンドに一致を要求します。バックエンドは彼に後で戻ってくるように言います
  4. ユーザー D がバックエンドに一致を要求します。彼はCとマッチします。
  5. 等々...

(編集:これを理解できれば、ターンベースのゲームの他のほとんどの操作で同じ実装を使用できると仮定しています)

これはApple GamecenterXbox Liveで非常に簡単に実行できますが、GAE のようなオープンでプラットフォームに依存しないバックエンドで実装したいと考えています。いくつかの調査の後、GAE 実装の次のオプションを見つけました。

  • memcache を使用します。ただし、me​​mcache が異なるインスタンス間で同期されるという保証はありません。いくつかのテストを行ったところ、memcache の同期ミスが原因でマッチ リクエストが消えることが実際に確認できました。
  • シャーディング カウンターを使用して memcache を強化します。これで常に複数インスタンスの問題が解決されるわけではなく、memcache クォータの使用率が高くなる可能性があります。
  • Compare and Set で memcache を使用します。ミューテックスとして使用する場合、複数インスタンスの問題は解決されません。
  • タスク キュー。これらの使用方法はわかりませんが、誰かが可能な解決策として言及しました。ただし、キューが GAE クォータをすぐに消費してしまうのではないかと心配しています。
  • キューをプッシュします。同上。
  • 取引。同上。また、おそらく非常に高価です。
  • チャネル。同上。また、おそらく非常に高価です。

マッチメイキングはオンライン ゲームの非常に基本的な操作であることを考えると、これに遭遇したのは私が最初ではありません。したがって、私の質問:

  • マッチメイキングのための安全なメカニズムを知っていますか?
  • 複数のソリューションが存在する場合、(GAE クォータの使用に関して)最も安価なソリューションはどれですか?
4

1 に答える 1

1

次のようなスキームでcronタスクを使用してこれを実現できます。

define MatchRequest:
    requestor = db.StringProperty()
    opponent = db.StringProperty(default = '')

ユーザー A が対戦を要求すると、A を要求者、対戦相手を空白にして MatchRequest エンティティが作成されます。ユーザー A は、対戦相手のフィールドがいつ満たされたかを確認するために投票します。ユーザー B が一致を要求すると、B を要求元として MatchRequest エンティティが作成されます。ユーザー B は、対戦相手のフィールドがいつ満たされるかを確認するためにプールします。

20 秒ごとに実行される cron ジョブ? またはそう実行します:

  1. 対戦相手 == '' のすべての MatchRequest を取得します
  2. すべての適切な一致を行う
  3. すべての MatchRequests をトランザクションとして配置

A と B が次に投票すると、対戦相手がいることがわかります。

crons無料アプリの GAE ドキュメントによると、最大 20 個の無料の cron タスクを持つことができます。少数のユーザーの場合、これらの cron に必要な計算は小さくする必要があります。

これは安全な方法ですが、それが最も安い方法かどうかはわかりません。また、実装も非常に簡単です。

于 2013-02-06T21:38:58.853 に答える