2013-05-29 105 views
1

是否有流星應用的設計模式來處理多個客戶端插入相同的邏輯記錄「同步」?流星重複插入衝突解決

具體來說,我有一個得分型的應用程序,以及多個客戶端可以創建初期,基本是空白,得分紀錄,參賽者時,參賽者準備好開始。然後使用該記錄的外觀使其在頁面上可供官員編輯,增加懲罰計數等。

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對的Score的多個客戶端。

在同步程序,我會傾向於使用某種形式的環環相扣,或者關係數據庫鍵約束。

回答

1

那麼,根據this answer流星$ UPSERT標誌依然在增強名單,似乎在穩定分支添加後的1.0版本。

所以,第一種方式是它是怎麼說的添加一個唯一索引:

所有的實施方式是listed here。我建議你使用本地mongo索引,而不是代碼實現。

樂觀併發方式是根據在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