速率限制 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();
    });
});

我认为我无法在此代码上轻松使用 setTimeoutsetInterval(我什至不确定是否允许在 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();
    });
});