6

ソーシャルチェスゲームを実装しています。すべてのユーザーは新しいゲームを作成でき、システムが対戦相手を見つけるまで待ちます。

ユーザーがゲームを作成するとき、彼らは制約を指定します: プレイしたい色と対戦相手の最小チェス レーティングです。

対戦相手は一致する場合と一致しない場合があります。たとえば、次の 2 つの対戦相手が一致します。

// User 1 with rating 1700              // User 2 with rating 1800
// creates this game                    // creates this game
game: {                                 game: { 
  color: 'white',                         minRating: 1650
  minRating: 1600                       }
}                                       // User did not specify a preferred color,
                                        // meaning they do not care which color to play

そのため、ユーザー 1 がシステム内の最初のユーザーであり、ゲームを作成した場合、ユーザーは待機します。ユーザー 2 がゲームを作成すると、すぐにユーザー 1 と一致するはずです。

一方、次の 2 人の対戦相手はどちらも白でプレイしたいので、一致しません。この場合、他の誰かがcolor: 'black'(または色が指定されていない) ゲームを作成するまで待つ必要があり、minRatingそれは要件に一致します。

// User 1 with rating 1700              // User 2 with rating 1800
// creates this game                    // creates this game
game: {                                 game: { 
  color: 'white',                         color: 'white'  
  minRating: 1600                         minRating: 1650
}                                       }

私の懸念は、何千人ものユーザーが同時に新しいゲームを作成するシナリオに関連しています。デッドロックを作成せずに対戦相手を一致させるにはどうすればよいですか? つまり、ユーザー 1、ユーザー 2、およびユーザー 3 が同時に対戦相手を見つけようとしていて、それらのマッチング アルゴリズムがユーザー 99 を返すシナリオをどのように回避するのですか。ユーザー 99 をいずれか 1 つだけに割り当てて、このシナリオから回復するにはどうすればよいですか。彼ら?

このようなマッチング システムを実装するために、Firebase の機能をどのように使用しますか?

4

2 に答える 2

2

特に複数のフィールドを一致させたい場合は、NoSQL 環境では難しい作業です。

あなたの場合、色ごとに単純なインデックスを設定し、色内に優先順位をminRatingに設定してゲームへの参照を保存します。こうすることで、minRating の優先度で好みの色でゲームをクエリできます。

indexes: {
  color:{
     white:{
        REF_WITH_PRIORITY_TO_RATING: true
     },
     black:{
        REF_WITH_PRIORITY_TO_RATING: true
     }
  }
}

試合が始まるたびに情報を取得したい場合:

ref = new(Firebase)('URL');
query =ref.child('color_index/white/').startAt(minPriority);
query.on('child_added',function(snapshot){
  //here is your new game matching the filter
});

dropRateただし、ゲームをフィルタリングするために複数のフィールドを導入すると、これはより複雑になりtimeZoneます。

indexes: {
  GMT0: {
    color:{
       white:{
          REF_WITH_PRIORITY_TO_RATING: true
       },
       black:{
          REF_WITH_PRIORITY_TO_RATING: true
       },
  }
  GMT1: {
       // etc
  }
}
于 2014-07-30T13:41:04.847 に答える