Murayama blog.

プログラミング教育なブログ

Parse - Cloud Code - Background Jobs

Background Jobs

Parseにはバックグラウンドで動作するジョブをセットすることができます。バックグラウンドジョブは、レスポンスタイムのかかる外部サイトとの連携や、プッシュノーティフィケーションのバッチ処理といった時間のかかるタスクに有効です。Cloudファンクションの実行でタイムアウトが発生した場合は、バックグラウンドジョブの実行を検討してください。

バックグラウンドジョブを実行するには、いくつかの制約に従う必要があります。

  • ジョブの実行時間が15分を超えると終了する
  • Basic planのユーザは並行処理できるジョブは1つだけとなる。他のスケジュールされたジョブはキューに登録される
  • Pro planのユーザは並行処理できるジョブは2つとなる。 他のスケジュールされたジョブはキューに登録される

Writing a Background Job

バックグラウンドジョブの記述はCloudファンクションと似ています。Parse.Userオブジェクトにplanフィールドを追加するユーザマイグレーションを実行するなら次のようになります。

Parse.Cloud.job("userMigration", function(request, status) {
  // Set up to modify user data
  Parse.Cloud.useMasterKey();
  var counter = 0;
  // Query for all users
  var query = new Parse.Query(Parse.User);
  query.each(function(user) {
      // Update to plan value passed in
      user.set("plan", request.params.plan);
      if (counter % 100 === 0) {
        // Set the  job's progress status
        status.message(counter + " users processed.");
      }
      counter += 1;
      return user.save();
  }).then(function() {
    // Set the job's success status
    status.success("Migration completed successfully.");
  }, function(error) {
    // Set the job's error status
    status.error("Uh oh, something went wrong.");
  });
});

Cloundファンクションではsuccess、errorをハンドリングしていました。バックグラウンドジョブでは、処理の完了時にstatus.success() かstatus.error()を呼び出すことで、ジョブの実行結果が設定されます。もし、これらのメソッドを呼び出さなかった場合、ジョブは持ち時間の15分を経過してタイムアウトする形になります*1。status.message()を呼び出せば処理の途中経過を出力できます。ただし、status.success()を呼び出した後にstatus.message()を呼び出しても無視されます。

上記のコードをデプロイしたら、次のコマンドを実行してテストしてみましょう。

 curl -X POST \
  -H "X-Parse-Application-Id: ${APPLICATION_ID}" \
  -H "X-Parse-Master-Key: ${MASTER_KEY}" \
  -H "Content-Type: application/json" \
  -d '{"plan":"paid"}' \
  https://api.parse.com/1/jobs/userMigration

Setting up a Schedule

バックグラウンドジョブをデプロイできたら、DashboardのCloud Codeタブからジョブをスケジューリングできるようになります。Scheduled Jobsペインでは、スケジュール済みのジョブの確認と新たなジョブを追加することができます。新たなジョブを登録したら、ジョブの説明、必要なパラメータ、実行時間、実行頻度を指定します。スケジューリングされたジョブはその場で実行することもできます。また、ジョブスケジュールからの削除も可能です。Job Statusペインでは、ジョブの実行結果がリスト表示されます。ジョブの開始時間、最新のステータスメッセージ、実行結果を確認することができます。

*1:と書いてるけどsuccessとerrorを呼ばないようにすると15分待たずにFailedとなるみたい。