2013-05-29 2 views
1

동일한 논리 레코드를 '동시에 삽입하는 다중 클라이언트를 처리하기 위해 유성 애플리케이션에 디자인 패턴이 있습니까?Meteor 중복 삽입 충돌 해결

특히 내가 득점 유형 응용 프로그램을 가지고 있고 여러 클라이언트가 응모자가 시작할 준비가되었을 때 응모자에 대한 기본적으로 빈 점수 기록을 만들 수 있습니다. 그런 다음 레코드의 모양을 사용하여 공무원이 편집 할 수 있도록 페이지에서 사용 가능하도록하고 페널티 수 등을 증가시킵니다.

Stages = new Meteor.Collection("contests"); 
Entrants = new Meteor.Collection("entrants"); 
Scores = new Meteor.Collection("scores"); 

// official picks the next entrant 
Scores.insert(stage_id:xxxx, entrant_id:yyyy) 

컬렉션에 포함 된 점수 레코드의 수정 사항에 대한 충돌 해결의 의미에 만족합니다. stage_id/entrant_id 쌍의 점수를 삽입하려는 여러 클라이언트를 처리하는 방법을 잘 모르겠습니다.

동기식 응용 프로그램에서는 인터 로킹 또는 관계형 DB 키 제약 조건을 사용하는 경향이 있습니다.

답변

1

글쎄, this answer에 따르면 Meteor $ upsert 플래그는 여전히 개선 목록에 있으며 1.0 릴리스 이후 stable branch에 추가 된 것으로 보입니다.

모든 구현 방법 listed here 같습니다

은 그래서 첫 번째 방법은이 고유 인덱스를 추가하는 것으로 알려졌다 방법이다. 코드 구현이 아닌 원시 몽고 색인을 사용하는 것이 좋습니다.

낙천적 동시성 방법은 MongoDB에서 트랜잭션이 없으면 훨씬 더 복잡합니다. 내 대답의 죄송합니다, 이전 버전이

이 당신에게 좋은 아이디어를 줄 것이다

var result_callback = function(_id) { 
    // callback to call on successfull insert made 
} 

var $set = {stage_id: xxxx, entrant_id: xxxx}; 
var created_at = Date.now().toFixed(); 
var $insert = _.extend({}, $set, {created_at: created_at}); 
Scores.insert($insert, function(error, _id) { 
    if (error) { 
    //handle it 
    return; 
    } 
    var entries = Scores.find($set, {sort: {created_at: -1}}).fetch() 
    if (entries.length > 1) { 
    var duplicates = entries.splice(0, entries.length - 1); 
    var duplicate_ids = _.map(duplicates, function(entry) { 
     return entry._id; 
    }); 
    Scores.remove({_id: {$in: duplicate_ids}}) 
    Scores.update(entries[0]._id, $set, function(error) { 
     if (error) { 
     // handle it 
     } else { 
     result_callback(entries[0]._id) 
     } 
    }) 
    } else { 
    result_callback(_id); 
    } 
}); 

희망)이었다 여기

은 (버그가있을 수 있습니다주의)))의 내 구현 온다 완전히 틀렸다.

+0

관련 질문은 도움이됩니다. 나는 주로 고객이 보게 될 것을 생각하고 있었다. 사용자가 스테이지를 '열린'상태로 표시 할 때 스테이지의 모든 스코어를 미리 작성하는쪽으로 기울고 있습니다. 이것은 위와 같은 문제를 해결할뿐만 아니라 다른 수집 물에없는 반응성 휘젓감 목록 항목을 피합니다. –

+0

사전 작성은 내가 생각하기에 최선의 해결책이 될 것입니다. 훨씬 더 간단합니다. 훨씬 더 투명합니다. – icanhazbroccoli