2

一部のデータを消費している App Engine 上にアプリケーションがあります。そのデータを解析した後、一定期間内に何かを実行する必要があることがわかります。おそらく、数時間または数週間ではありません。

App Engine で任意の時間が経過した後にコードを実行する最良の方法は何ですか?

TaskQueue からCountdown MillisまたはEtaMillisを使用するとうまくいくと考えましたが、特にそのような長い時間枠で、誰かが同じことをしているという証拠は見たことがありません。

それが最善のアプローチですか、それとももっと良い方法がありますか?

4

5 に答える 5

2

TaskQueueのカウントダウンパラメータを使用して、登録から7日後に顧客にメールを送信したり、その他の多くのニーズに対応したりしています。

タスクキューはコア/基本API/サービスであり、かなり信頼性があります-私の意見では、次の場合を除いて、タスクキューETA/カウントダウンを使用するのが最善の方法です。

  • プログラムでキューにあるものを確認する能力が必要
  • プログラムでキューから特定のタスクを削除する機能が必要
于 2013-02-21T17:03:42.927 に答える
2

将来の処理(オブジェクトのデータの処理を開始するタイミングを含む)のためにすべての関連情報をデータストアに保持できる場合は、cronジョブで日付/時刻範囲フィルターを使用してデータストアに定期的にクエリを実行できます。そして、適切なタイミングで上記のオブジェクトのいずれかの処理をトリガーします。

于 2013-02-21T00:25:57.737 に答える
1

タスク キューをスケジューラとして使用しています。QueueConstantsで宣言され、 QueueImplで適用される30 日間の最大 eta があります。

  //Returns the maximum time into the future that a task may be scheduled.
  private static final long MAX_ETA_DELTA_MILLIS = 2592000000L;

1000 ミリ秒 * 60 秒 * 60 分 * 24 時間 * 30 日 = 2592000000 ミリ秒

 private long determineEta(TaskOptions taskOptions) {
Long etaMillis = taskOptions.getEtaMillis();
Long countdownMillis = taskOptions.getCountdownMillis();
if (etaMillis == null) {
  if (countdownMillis == null) {
    return currentTimeMillis();
  } else {
    if (countdownMillis > QueueConstants.getMaxEtaDeltaMillis()) {
      throw new IllegalArgumentException("ETA too far into the future");
    }
    if (countdownMillis < 0) {
      throw new IllegalArgumentException("Negative countdown is not allowed");
    }
    return currentTimeMillis() + countdownMillis;
  }
} else {
  if (countdownMillis == null) {
    if (etaMillis - currentTimeMillis() > QueueConstants.getMaxEtaDeltaMillis()) {
      throw new IllegalArgumentException("ETA too far into the future");
    }
    if (etaMillis < 0) {
      throw new IllegalArgumentException("Negative ETA is invalid");
    }
    return etaMillis;
  } else {
    throw new IllegalArgumentException(
        "Only one or neither of EtaMillis and CountdownMillis may be specified");
  }
}

}

于 2014-10-26T18:48:23.630 に答える
0

私は次のことを行います:

  1. あなたが言及したように遅延が設定されたタスクをキューに入れます。既知の方法でデータストア エントリを変更するタスク処理を行います (たとえば、フラグを設定します)。

  2. エンキューされたタスクによって何らかの理由で見逃された処理を実行するために、ストラグラーの低頻度の cron ジョブを用意します (たとえば、タスクでキャッチされない例外が発生した場合)。

これを機能させるには、タスクと cron ジョブによって呼び出される処理がべき等であることを確認してください。

楽しみ?

于 2013-02-21T13:54:28.677 に答える
-1

taskQueue は良い戦略だと思いますが、1 つ大きな問題があります。ソース

代わりにdatastoreを使用します。ここにあなたが取ることができる1つの戦略があります:

  1. 「そのデータの解析」が完了したら、レコードをデータストアに挿入します。
  2. 作成日/挿入日に対して現在の日付を確認して、ジョブが完了/開始されてからの経過時間を確認します (明らかに、1 分ごとに実行したくないなど、1 日または 1 時間ごとに実行する必要があります)。
  3. ステップ 2 の条件が「任意の時間」を経過したらすぐに、次のタスクを実行します。

データ ストアにレコードを追加する方法は次のとおりです。

    Entity parsDataHolder = new Entity("parsing_data_done", guestbookKey);
    parsDataHolder.setProperty("date", date);

DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
datastore.put(parsDataHolder)
于 2013-02-21T00:58:40.973 に答える