在解析服务器中,我有一个名为Stats
的类,其中包含列timeScore
(数字)
我正在使用云代码更新列timeScore
中的所有25万行。
我的代码运行良好,除了我得到以下H12-请求超时错误而没有明显原因。
heroku[router]: at=error code=H12 desc="Request timeout" method=POST path="/parse/functions/timeScore
无论选择什么batchSize,我都会收到超时错误,并且每30秒就会收到一次。我总共得到了5次。第5次之后,我不再了解它,该过程继续进行并完成,没有任何问题或错误。我在处理大约2.5分钟(30秒* 5)时收到第五个也是最后一个错误。整个过程大约需要14分钟。这些超时错误不会以任何方式影响该过程。不管选择的batchSize如何,并且不管是否发生超时错误,所有250k对象都将被更新和保存。
我想可能是因为我从未致电results.error
或results.success
,服务器认为我仍在做一些工作并显示错误。但是,如下所示,我更新了代码以包括它们,但仍然收到超时错误。
问题是在每个超时错误processBatch()
之后,从开头再次调用。由于我收到5次超时错误,processBatch()
被调用了5次。因此,在第五次超时错误之后,有5个processBatch()
函数同时运行(我通过日志确认了此功能)。这使得该过程花费的时间更长。
我没有执行任何长时间运行的操作。我只是在解析服务器上更新并保存数据。
这是我的代码:
var _ = require("underscore");
Parse.Cloud.define("timeScore", function(request, response) {
var counter = 0;
function processBatch(query, batchSize, startingAt, process) {
query.limit(batchSize);
query.skip(startingAt);
return query.find().then(results => {
return process(results).then(() => results.length);
}).then(length => {
return (length === batchSize)? processBatch(query, batchSize, startingAt+length, process) : {};
});
}
function setTimeScores(stats) {
console.log("LENGTH " + stats.length);
_.each(stats, stat => {
counter ++;
stat.set("timeScore", counter);
});
return Parse.Object.saveAll(stats);
}
var query = new Parse.Query("Stats");
processBatch(query, 1000, 0, setTimeScores).then(results => {
response.success(results);
}).catch(error => {
response.error(error);
});
});
这就是我的称呼
#!/usr/bin/env node
var Parse = require("parse/node");
Parse.initialize("xx", "xx");
Parse.serverURL = "http://randomapp.herokuapp.com/parse";
Parse.Cloud.run('timeScore');
是什么导致我收到的heroku超时错误?我如何解决它?