Parse Cloud Code でデータのバッチを保存するにはどうすればいいですか? 質問する

Parse Cloud Code でデータのバッチを保存するにはどうすればいいですか? 質問する

私のクラウドコードでは、約50,000件のレコードすべてを新しいデータで更新したいのですが、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

基本的にクラウドアーキテクチャでは、リクエストタイムアウト時間は近づいている60秒、しかし、あなたは挿入しようとする数千1 回のトランザクションでレコードを取得するには 60 秒以上かかるため、リクエストは常に失敗します。

大量のレコードを挿入するにはもっと良い方法があります。

  1. タスクキュー
  2. Cronまたはスケジュールされたタスク

タスクキューの方があなたの問題には適していると思います。このビデオを見れば、タスクキューについて素晴らしいアイデアが得られます。

タスクキューと cron ジョブ

おすすめ記事