문제

나를 구현하는 사회적 체스 게임입니다.모든 사용자 수 있는 새로운 게임을 만들고,그들은 때까지 기다렸다가 시스템에 대한 상대를 찾을 수 있다.

사용자는 게임을 만들,그들은 제약 조건을 지정:그들이 원하는 색상을 재생하고 싶고,상대의 최소 체스았습니다.

상대할 수 있습과 일치하거나 일치하지 않습니다. 예를 들어,다음 두 상대 일치합니다:

// 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.

다른 측면에서,다음과 같은 두 상대와 일치하지 않을 수 있기 때문에,그들은 모두 놀고 싶은 흰색이다.이 경우,양쪽까지 기다려야 한 다른 사람을 만듭니다 게임 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 만 그 중 하나는?

당신은 어떻게 사용하여 전력의 중포 기지를 구현하는 같은 일치하는 시스템입니까?

도움이 되었습니까?

해결책

그것은 도전적인 작업에서 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,'gamesPlayed'etc...이 경우에는할 수 있습니다 깊은 인덱스:

indexes: {
  GMT0: {
    color:{
       white:{
          REF_WITH_PRIORITY_TO_RATING: true
       },
       black:{
          REF_WITH_PRIORITY_TO_RATING: true
       },
  }
  GMT1: {
       // etc
  }
}

다른 팁

분명한 선택을 위한 시작점이 될 것이 컬러,이것은 독점적인 요구 사항입니다.다른 사람들처럼 더 많은 것중 결과는,그래서 그 수 있는 단순히 증가 또는 감소입니다.

을 활용에 대한 우선순위 최소/최대 범위,그리고 각각 유지에 별도의"인덱스".다음을 잡아 일치에 대한 각을 만들고합니다.이것을 고려한 구조:

/matches
/matches/colors/white/$user_id
/matches/ranking/$user_id (with a priority equal to ranking)
/matches/timezones/$user_id (with a priority of the GMT relationship)

지금를 쿼리하는데,단순히 잡아 경기에서 각각의 카테고리와 그의 수에 의하여 일치합니다.시작할 수 있습과는 색상이기 때문에,아마도 아닌 선택사항 또는 상대적 평가:

var rootRef = new Firebase('.../matches');

var VALUE = {
   "rank": 10, "timezone": 5, "color": 0
}

var matches = []; // a list of ids sorted by weight
var weights = {}; // an index of ids to weights

var colorRef = rootRef.child('colors/black');
colorRef.on('child_added', addMatch);
colorRef.child('colors/black').on('child_removed', removeMatch);

var rankRef = rootRef.child('ranking').startAt(minRank).endAt(maxRank);
rankRef.on('child_added', addWeight.bind(null, VALUE['rank']));
rankRef.on('child_removed', removeWeight.bind(null, VALUE['rank']));

var tzRef = ref.child('timezone').startAt(minTz).endAt(maxTz);
tzRef.on('child_added', addWeight.bind(null, VALUE['timezone']));
tzRef.on('child_removed', removeWeight.bind(null, VALUE['timezone']));

function addMatch(snap) {
   var key = snap.name();
   weights[key] = VALUE['color'];
   matches.push(key);
   matches.sort(sortcmp);
}

function removeMatch(snap) {
   var key = snap.name();
   var i = matches.indexOf(key);
   if( i > -1 ) { matches.splice(i, 1); }
   delete weights[key]; 
}

function addWeight(amt, snap) {
   var key = snap.name();
   if( weights.hasOwnProperty(key) ) {
      weights[key] += amt;
      matches.sort(sortcmp);
   }
}

function removeWeight(amt, snap) {
   var key = snap.name();
   if( weights.hasOwnProperty(key) ) {
      weights[key] -= amt;
      matches.sort(sortcmp);
   }
}

function sortcmp(a,b) {
   var x = weights[a];
   var y = weights[b];
   if( x === y ) { return 0; }
   return x > y? 1 : -1;
}

자,이제 내가 무엇을 모두 요청에 이용하는 경우--을 만드는 방법을 기초 where.그러나,적절한 대답을 여기에는 검색을 수행해야 합 검색 엔진입니다.이것은 간단하는 상태입니다.이중점 검색에 대한 최고의 일치하기 때문에,같은 분야 색하지 않은 선택사항 또는 단순히 과 일치하는 동안,다른 사람--순위는 어쩌면--는 가장 일치하는 어느 방향에 있는 동안 단순히 일부에 영향을 미칠 품질 의 일치합니다.

체크아웃 손전등 에 대한 간단한동 방법을 제어합니다.이 방법을 할 수 있어야의 활용 ES 의 훌륭한 가중치의 도구,동적 분류,다른 모든 것들를 수행하는 데 필요한 적절한 일치하는 알고리즘이 있습니다.

에 대한 교착 상태.내가 너무 많이 넣지 않는다 초점이 여기에 있을 때까지의 수백을(초당 트랜잭션 즉의 수백 수천 명의 사용자를 위해 경쟁하는 경).분할 경로 우리는 쓸 것을 받아들이 참여하고 트랜잭션을 위해 오직 한 사람에 성공을 얻습니다.유지 별도의 데이터를 읽도록 잠금을 길지 않을 것이 느리게 처리합니다.계속 트랜잭션을 최소 크기(단장 가능한 경우).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top