3

私は、ユーザーがサーバーに接続して、ゲームをプレイしたいレベルのユーザーを見つけるゲームを持っています。ここにゲームリクエストの基本的なアーキテクチャがあります。GAE + ndbを使った試合

enter image description here

私はGoogleのデータストア内の各ユーザーレベルの待機キューを保存するためにndbを使用しています。

私はこれらのキューにアクセスして、一貫性を確保しています(this article)。エンティティは、繰り返された(のリスト)LocalStructuredPropertyを使用してキューに格納されます。

質問:それは要求に一致しているので、エンティティが待ちキューから削除され

  1. 。トランザクションはコミットされていますが、まだ適用されていません。同じエンティティが別の要求と照合され、削除されます。これはエラーを投げるでしょうか?
  2. これらの強固に一貫したアクセスは〜1書き込み/秒に制限されています。この制約を取り除く優れたアーキテクチャはありますか?

私が後者の問題について考えてきたことの1つは、複数のキュー(要求が増えて縮小する)を維持することです。

答えて

2

あなたの最初の質問についてはわかりませんが、あなたのトランザクションではsleep文を使ってそれをシミュレートすることができます。

2番目の質問には、使用できる別のアーキテクチャがあります。待ち行列の待ち時間が比較的短い場合(数時間ではなく数分)、memcacheを使用することができます。ディスクへの書き込みよりもはるかに高速で、一貫性の問題を回避することができます。

+0

うん、誰かが:)理論を知っていた期待していました。 [memcacheが削除されてしまった](https://cloud.google.com/appengine/articles/scaling/memcache#what)が心配でした。どのくらいの頻度でそれが起こるか考えてみてください – Alex

+0

memcacheが落とされる頻度はわかりませんが、memcache(他のユーザーも含む)の合計負荷/需要に依存していることが分かります。 NDBとmemcacheの両方に書き込むことで、それを管理できます。キューに祖先がない場合は、1つのwrite/sec制約によって制限されるべきではなく、親キーにのみ適用されます。 –

1

1.エンティティをトランザクション内でgetとpostを実行すると、同じエンティティをゲームに照合することができず、エラーもなくなり、一貫性が保たれます。

2.同じエンティティグループ内のトランザクションの場合、1秒あたりの書き込み量は制限値です。さらに必要な場合は、キューエンティティをシャードすることができます。

専用memcacheまたはredisインスタンスを使用して、競合を避けることができます。これはデータストアよりもはるかに高速です。これらの人は仲人を行うには、ツリー・ノードを使用する方法を参照してください

https://www.youtube.com/watch?v=9nWyWwY2Onc

+0

[memcacheが破棄されてしまう](https://cloud.google.com/appengine/articles/scaling/memcache#what)が心配でした。どのくらいの頻度でそれが起こるか考えてみてください – Alex

+0

そのビデオのマッチメイキングシステム(プレーヤーレベルのバケットを使用)は、質問で提案されているものと似ています(各レベルの異なるキュー)。私は行方不明のものがありますか? – Alex

+0

Memcacheはキーがいっぱいになるとキーを削除します。あなた専用のサーバーをあなたに支払っていない限り、それを制御することはできません。 – janscas

関連する問題