2015-12-15 4 views
31

私のクラウドコードでは、約50kの私のすべてのレコードを新しいデータで更新したいと思います。 しかし、私は1000レコードの制限に従っても私の仕事は失敗することに気づいた。 成功/エラーがこのジョブのエラーと呼ばれていません。 任意のアイデアこれをどのように解決できますか?Parse Cloud Codeにデータのバッチを保存する方法は?

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

なぜ約束を使用していませんか? –

+0

@MoNazemi私はsaveAllの約束を試しましたが、私はまだ同じ結果を得ます –

+0

どうして失敗しますか?それはタイムアウトですか?ジョブは15秒後に切断されます... – Moonwalkr

答えて

0

回避策:あなたはホスティングサービスによって制限されたレコードの許容可能な低い数のバッチでcronジョブをスケジュールすることができ、あなたが持っている制限します。たとえば、毎分10個の要求しか処理できない場合は、まず更新する必要があるすべてのIDを要求し、サーバーが制限時間内に受け入れて処理するチャンクに分割します。これは単なる回避策です。

長期的:より良い解決策は、サーバが重い作業をすべて強制するのではなく、サーバーからできるだけ少ないデータを要求するようにアプリケーションを設計することです。これにより、サーバー上に隠されたプロセスとして座るのではなく、便利な公開APIを介してビジネスロジックを公開することもできます。

1

は、基本的には、クラウドアーキテクチャでは、要求タイムアウト時間は約60秒ですが、1つのトランザクションで何千を超えるレコードを挿入しようと、それはあなたの要求は常に失敗理由です、60秒以上かかります。レコードの大きな金額を挿入するためのより良い方法があります

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

は、私はタスクキューがあなたの問題のために優れていると思います。 あなたは何の疑いがある場合は、午後
に気軽タスクキュー

Task queue & cron jobs

についてスーパーアイデアを得ることができ、このビデオを見ていただきありがとうございます。

関連する問題