중포 기지:어떻게 일치하는 상대에서 게임은?
-
21-12-2019 - |
문제
나를 구현하는 사회적 체스 게임입니다.모든 사용자 수 있는 새로운 게임을 만들고,그들은 때까지 기다렸다가 시스템에 대한 상대를 찾을 수 있다.
사용자는 게임을 만들,그들은 제약 조건을 지정:그들이 원하는 색상을 재생하고 싶고,상대의 최소 체스았습니다.
상대할 수 있습과 일치하거나 일치하지 않습니다. 예를 들어,다음 두 상대 일치합니다:
// 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 의 훌륭한 가중치의 도구,동적 분류,다른 모든 것들를 수행하는 데 필요한 적절한 일치하는 알고리즘이 있습니다.
에 대한 교착 상태.내가 너무 많이 넣지 않는다 초점이 여기에 있을 때까지의 수백을(초당 트랜잭션 즉의 수백 수천 명의 사용자를 위해 경쟁하는 경).분할 경로 우리는 쓸 것을 받아들이 참여하고 트랜잭션을 위해 오직 한 사람에 성공을 얻습니다.유지 별도의 데이터를 읽도록 잠금을 길지 않을 것이 느리게 처리합니다.계속 트랜잭션을 최소 크기(단장 가능한 경우).