如何在Parse云代码中保存一批数据?

32
在我的云代码中,我想使用新数据更新约50k的所有记录。但是我注意到即使遵循1000条记录限制,我的任务仍然失败了。我收到了一个“未调用成功/错误”的错误信息。你有任何解决方法吗?
Parse.Cloud.job("hello", function(request, response) {
Parse.Cloud.useMasterKey();  
var results = [];
var limit = 1000;

var saveUpdatedQueries = function(queries) {
    console.log("updating records " + queries.length);

    Parse.Object.saveAll(queries,{
        success:function(lists){
        console.log("lists ok "+lists.length);

        if (!results.length) {
            response.success("finished");
            return;
        }

        updatingRecords(lists.length);

        },error: function(reason){
            console.log("error");
        }
    });
}

var updatingRecords = function(skip) {
    var tempRecords = [];

    if (skip) {
        results = results.slice(skip);
    }

    console.log("skip: " + skip + " Results length: "+ results.length);

    for (var i = 0; i < results.length; i++) {
        var today = new Date();
        var newObject = results[i];
        newObject.set('newCulumn', today);
        tempRecords.push(newObject);

        if (i === results.length - 1 || tempRecords.length === limit) {
            break;
        };
    };

    saveUpdatedQueries(tempRecords);
}

var processCallback = function(res) {
    results = results.concat(res);
    if (res.length === limit) {
        process(res[res.length - 1].id);
        return;
    }

    updatingRecords(0);
}

var process = function(skip) {
    var query = new Parse.Query(Parse.Installation);

    if (skip) {
        query.greaterThan("objectId", skip);
    }

    query.limit(limit);
    query.ascending("objectId");
    query.find().then(function querySuccess(res) {
    processCallback(res);

    }, function queryFailed(reason) {
        if (reason.code == 155 || reason.code == 141) { // exceeded parse timout
            console.log("time out error");
            process(skip);
        } else {
            response.error("query unsuccessful, length of result " + results.length + ", error:" + reason.code + " " + reason.message);
        }
    });
}

process(false);

});

1
你为什么不使用 Promises? - Mo Nazemi
@MoNazemi 我尝试使用saveAll promises,但仍然得到相同的结果。 - Soheil
通常情况下,它会在大约3分钟后停止,并显示“未调用成功/错误”。当我查看数据云时,它只更新了1750条记录。我注意到请求调用已经超过每秒30次的限制。 - Soheil
3
如果您每分钟的请求次数超过1800次,您将达到免费计划的使用上限。 - Mo Nazemi
2
在你的应用程序中嵌入保留(例如,1/3/7天的不活动)推送是一个好的做法,而不是使用 Parse。你的应用程序确切地知道上次启动时间,并且可以避免在处理时间和推送接收时间之间向已经启动了你的应用程序的用户发送通知的情况。对于 Android,你可以使用 Alarm Manager。iOS 和 Windows 也应该支持类似的功能。 - Zibi
显示剩余6条评论
2个回答

1
基本上在云架构中,请求超时时间大约为60秒,但是如果您尝试在一个事务中插入超过数千条记录,则需要超过60秒,这就是为什么您的请求总是失败的原因。
有更好的方法可以插入更多的记录,
  1. 任务队列
  2. Cron或定期任务
我认为对于您的问题,任务队列是更好的选择。 观看此视频,您可以了解有关任务队列的超级想法 任务队列和cron作业

0

解决方法:您可以将cron作业分批处理,每批处理的记录数量不超过您所使用的主机服务限制。例如,如果您每分钟只能处理10个请求,则首先请求需要更新的所有ID,然后将它们分成服务器可以接受并在时间限制内处理的块。这只是一个解决方法。

长期解决方案:更好的解决方案是设计您的应用程序尽可能少地从服务器请求数据,而不是强制服务器完成所有繁重的工作。这还允许您的业务逻辑通过方便的公共API公开,而不是作为隐藏进程存在于您的服务器上。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接