В моем приложении Meteor для создания многопользовательского игрового сервера с разворотом клиентов клиенты получают состояние игры через публикацию/подписку и могут вызывать метод Meteor sendTurn
для отправки данных об обращении на сервер (они не могут напрямую обновлять коллекцию состояний игры).Параллелизм между Meteor.setTimeout и Meteor.methods
var endRound = function(gameRound) {
// check if gameRound has already ended/
// if round results have already been determined
// --> yes:
do nothing
// --> no:
// determine round results
// update collection
// create next gameRound
};
Meteor.methods({
sendTurn: function(turnParams) {
// find gameRound data
// validate turnParams against gameRound
// store turn (update "gameRound" collection object)
// have all clients sent in turns for this round?
// yes --> call "endRound"
// no --> wait for other clients to send turns
}
});
Чтобы реализовать ограничение по времени, я хочу, чтобы ждать в течение определенного периода времени (чтобы дать клиентам время для звонка sendTurn
), а затем определить круглый результат - но только если круглый результат уже не определен в sendTurn
.
Как я должен реализовать этот срок на сервере?
Моим наивным подходом к реализации этого было бы позвонить Meteor.setTimeout(endRound, <roundTimeLimit>)
.
Вопросы:
насчет параллелизм? Я предполагаю, что я должен обновлять коллекции синхронно (без обратных вызовов) в
sendTurn
иendRound
(?), Но этого было бы достаточно для устранения условий гонки? (Чтение 4-й комментария о принятом ответе на this SO question о синхронных операциях с базами данных также приносят, я сомневаюсь, что)В этой связи, что делает «по запросу» означает, в Meteor docs в моем контексте (функция
endRound
наречено вызов клиентского метода и/или на сервереsetTimeout
)?В Meteor код сервера работает в одном потоке для каждого запроса, а не в асинхронном обратном вызове, типичном для Node.
В среде с несколькими серверами/кластерами, (как) это будет работать?
Очень хорошо написанное резюме и ответ - спасибо! – thomers
Я нашел этот шаблон «Обновить документ, если текущий», описанный в документах mongo https://docs.mongodb.org/manual/tutorial/update-if-current/ Просто голова - «Изменено в версии 2.6: Метод db.collection.update() теперь возвращает объект WriteResult(), который содержит статус операции. Предыдущим версиям требовался дополнительный вызов метода db.getLastErrorObj(). " – thomers
@thomers это действительно влияет на Meteor API или он отвлечен? –