Приложение использует пакет meteor-redis
для выполнения запроса Redis, который иногда может занять 30 секунд, чтобы вернуть 100 000 результатов. В течение этого времени ожидания Meteor зависает и загружает ЦП на 100% в ожидании результатов запроса.
var client = redis.createClient(port, url)
client.zrangebyscoreSync = Meteor._wrapAsync(client.zrangebyscore)
client.zrangebyscoreSync(['game:scores', '', '+inf'], function(err, scores) {
_.each(scores, function(score, player) {
var doc = { ... }
Scores.insert(doc)
})
})
Вопрос. Можно ли как-то разрешить Meteor делать что-то еще, ожидая, пока Redis вернет огромный набор данных? Если client.zrangebyscore
не обернут Meteor._wrapAsync
, Meteor выдаст ошибку
Error: Meteor code must always run within a Fiber. Try wrapping callbacks that you pass to non-Meteor libraries with Meteor.bindEnvironment.
и трассировка указывает на строку Scores.insert(doc)
.