速率限制 parse.com 后台作业
Rate limiting parse.com background jobs
我在 parse.com 中有一些数据需要通过后台作业更新。大约有 100 百行。更新每一行使用 3 个解析查询 api。我每秒只允许 30 个查询,所以每次我 运行 作业时只更新前 9 行,并且在那一秒内碰巧访问系统的任何用户都会收到错误。
是否有一种简单的方法可以暂停作业,使其仅在 200 毫秒左右后更新一行,然后该作业仅使用可用查询的一半?这意味着作业将花费大约 20 秒到 运行,而不是仅仅一秒,但这是一个完全可以接受的权衡。
代码结构大致如下:
Parse.Cloud.job("UpdateData", function (request, status) {
Parse.Cloud.useMasterKey();
(new Parse.Query("Table"))
.find()
.then(function (rows) {
rows.forEach(function (row) {
// Some queries happen here
...
row
.set(...)
.save();
});
status.success();
}, function (error) {
status.error();
});
});
我认为我无法在此代码上轻松使用 setTimeout
或 setInterval
(我什至不确定是否允许在 parse.com 云代码上使用它们)。 JS 不支持 sleep()
或 wait()
.
之类的东西
我认为您的问题是您以同步方式返回 status.success()
,而不是等待代码循环完成。
试试这个(修改自 chaining Parse promises in a series):
Parse.Cloud.job("UpdateData", function (request, status) {
Parse.Cloud.useMasterKey();
var query = new Parse.Query("Table");
query.find().then(function (rows) {
var promise = Parse.Promise.as();
_.each(rows, function(row) {
promise = promise.then(function () {
row.set(...);
return row.save();
});
});
}).then(function () {
// All got saved
status.success();
}, function (error) {
// Something went wrong somewhere
status.error(error);
});
});
尝试 Parse.Object.saveAll
一次保存所有对象,如果您需要在 forEach 循环中进行其他查询,也可以将 Parse promises 链接成一系列 @mbm29414 提及。
以下代码片段显示了使用 Parse.Object.saveAll
一次保存对象的简单示例:
Parse.Cloud.job("UpdateData", function (request, status) {
Parse.Cloud.useMasterKey();
(new Parse.Query("Table"))
.find()
.then(function (rows) {
var toSaveList = [];
var promise = new Parse.Promise();
rows.forEach(function (row) {
// Some queries happen here
...
row.set(...);
...
toSaveList.push(row)
});
Parse.Object.saveAll(toSaveList, function() {
promise.resolve();
}, function() {
promise.reject();
});
return promise;
})
.then(function() {
status.success();
}, function() {
status.error();
});
});
我在 parse.com 中有一些数据需要通过后台作业更新。大约有 100 百行。更新每一行使用 3 个解析查询 api。我每秒只允许 30 个查询,所以每次我 运行 作业时只更新前 9 行,并且在那一秒内碰巧访问系统的任何用户都会收到错误。
是否有一种简单的方法可以暂停作业,使其仅在 200 毫秒左右后更新一行,然后该作业仅使用可用查询的一半?这意味着作业将花费大约 20 秒到 运行,而不是仅仅一秒,但这是一个完全可以接受的权衡。
代码结构大致如下:
Parse.Cloud.job("UpdateData", function (request, status) {
Parse.Cloud.useMasterKey();
(new Parse.Query("Table"))
.find()
.then(function (rows) {
rows.forEach(function (row) {
// Some queries happen here
...
row
.set(...)
.save();
});
status.success();
}, function (error) {
status.error();
});
});
我认为我无法在此代码上轻松使用 setTimeout
或 setInterval
(我什至不确定是否允许在 parse.com 云代码上使用它们)。 JS 不支持 sleep()
或 wait()
.
我认为您的问题是您以同步方式返回 status.success()
,而不是等待代码循环完成。
试试这个(修改自 chaining Parse promises in a series):
Parse.Cloud.job("UpdateData", function (request, status) {
Parse.Cloud.useMasterKey();
var query = new Parse.Query("Table");
query.find().then(function (rows) {
var promise = Parse.Promise.as();
_.each(rows, function(row) {
promise = promise.then(function () {
row.set(...);
return row.save();
});
});
}).then(function () {
// All got saved
status.success();
}, function (error) {
// Something went wrong somewhere
status.error(error);
});
});
尝试 Parse.Object.saveAll
一次保存所有对象,如果您需要在 forEach 循环中进行其他查询,也可以将 Parse promises 链接成一系列 @mbm29414 提及。
以下代码片段显示了使用 Parse.Object.saveAll
一次保存对象的简单示例:
Parse.Cloud.job("UpdateData", function (request, status) {
Parse.Cloud.useMasterKey();
(new Parse.Query("Table"))
.find()
.then(function (rows) {
var toSaveList = [];
var promise = new Parse.Promise();
rows.forEach(function (row) {
// Some queries happen here
...
row.set(...);
...
toSaveList.push(row)
});
Parse.Object.saveAll(toSaveList, function() {
promise.resolve();
}, function() {
promise.reject();
});
return promise;
})
.then(function() {
status.success();
}, function() {
status.error();
});
});