4

1000 人以上の同時プレイヤーが予想されるゲームのトーナメント バージョンを開発しています。トーナメントが始まると、プレイヤーは非常に速く (おそらく 1 秒あたり 5 人以上) 脱落しますが、トーナメントが進行するにつれてプロセスは遅くなります。プレーヤーがトーナメントからいつ敗退するかに応じて、一定量のポイントが授与されます。たとえば、最初にドロップしたプレーヤーは何も得られませんが、500 位のプレーヤーは 1 ポイントを受け取り、1 位の勝者は 200 ポイントを受け取ります。ここで、プレイヤーが排除された直後にポイントを授与して表示したいと思います。

問題は、プレーヤーが排除された後に新しい行をデータストアにプッシュするときに、行エンティティを別のエンティティ グループに配置する必要があるため、1 つのエンティティに対して 1 秒あたり 1 ~ 5 回の書き込みというゲー データストアの制限に達しないことです。グループ。また、脱落したすべてのプレイヤーの賞金を正しく決定できるように、一貫して行数を読み書きできる必要があります。

これをサポートするためにデータモデルを実装する最良の方法は何でしょうか?

4

2 に答える 2

2

プレイヤーの数が限られているため、数秒間の競合の問題が長時間持続する可能性は低いため、次の 2 つのオプションがあります。

  1. 問題を無視してください。消去のクラスターが発生しますが、それが持続的な状況でない限り、トランザクションの再試行メカニズムにより、すべてが確実に実行されます。
  2. 誰かが外出すると、これを個別に記録し、トーナメントのステータスを更新してランクを割り当て、非同期に行います。これは、ランクをすぐに通知することはできず、非同期で応答するか、ポーリングする必要があることを意味します。

率直に言って、前者をお勧めします。たとえ 1000 人トーナメントの半分が最初の 5 分間で終了したとしても (非常にありそうにないイベントです)、1 秒あたり 2 人未満の除去を見ていることになります。実際には、スパイクはそれよりも小さく、寿命も短くなります。

留意すべき点の 1 つは、トランザクションの再試行の仕組みにより、同じエンティティ グループで同時に発生したトランザクションは半ランダムな順序で解決されるということです。つまり、厳密な FIFO キューではありません。それが必要な場合は、自分で強制する必要がありますが、これは、あらゆる種類の分散システムで行うのは簡単なことではありません.

于 2010-12-19T23:04:25.693 に答える
0

既存のコメントと回答は、特定の質問に非常によく対応しています。

より高いレベルでは、この投稿とgoogle codejamteamのオープンソースライブラリをご覧ください。彼らは同様の問題を抱えており、任意のページの更新と要求の両方を効率的に処理するデータストアに基づいたスケーラブルなスコアボードを開発することになりました。

于 2011-01-27T23:25:47.353 に答える