1

私が構築しようとしているワークフローはこれです、多くの関連タスクをキューに入れ、並行して実行します (少なくとも数千) 関連するすべてのジョブが終了したら、ファイナライズ ジョブを実行します

その単一のファイナライズジョブを実行する方法がわかりません。関連するすべてのタスクが完了したら、このタスクをできるだけ早く実行したいと思います。ただし、私が考えることができる唯一のことは、すべてのタスクが終了したかどうかを確認し、ファイナライズ タスクをキューに入れる単一のスレッド化されたポーリング ジョブに頼ることです。

パイプラインのドキュメントhttps://code.google.com/p/appengine-pipeline/を見て、 http://www.google.com/events/io/2010/sessions/high-throughputを見ました-data-pipelines-appengine.html最初は有望に見えましたが、そこから良い解決策を見つけることができませんでした。

パイプライン ライブラリをもう少し検討した後、待機中のジョブを必要な数にスケーリングするために使用できるパターンを見つけたと思います。

バッチ エンキュー ジョブを作成します。このジョブは一度にタスクのバッチをキューに入れ、エンキューされたバッチが完了するのを待つ別のバッチ エンキュー ジョブを開始します。最後に、実行するバッチがなくなると、アグリゲーター ジョブが実行されます。

それは、多数の待機中のジョブに使用するパターンですか?

4

2 に答える 2

0

この説明はまだ実装していないので投稿していませんでしたが、GAE などのシステムで多数の必要なタスクが完了した後、サードパーティに依存せずに単一のタスクを実行する方法の概要を以下に示します。フレームワーク。

扇形に広がります

  1. fanoutCount = ファンアウト タスクの数
  2. fanoutCount = #、completeCount=0、ビット数のバイト配列 = fanoutCount でテーブル エントリを作成してコミットします。
    • テーブルの最大サイズは 1Mb なので、数百万のジョブをサポートします。それでも上限があるのが最も安全かもしれません
  3. エンティティ キーとタスク インデックス (インクリメント カウント) を使用してタスクをエンキューし、タスクを反復処理します。
    • 部分的に完了したファンアウト タスクを回復するための戦略を実装したい場合があります。タスクは冪等でなければならないため、毎回同じ作業が識別された場合に再起動できます

タスク コンシューマ

  1. 必要なビジネス ロジックを実行します。エンティティ キーは十分な識別子であると想定しています。
  2. ジョブ エントリ レコード ID とタスク インデックスを使用してエントリをファン イン キューにエンキューします。
  3. 注: タスクの冪等性。タスクが複数回実行されないという保証はありません。どちらでもかまいません
    • a) トランザクションでビジネス ロジックと最終キュー メッセージを実行し、ビジネス ロジックがまだ実行されていないことを確認します
    • b) 個々のビジネス ロジック ステップを冪等にする (ファン インは重複メッセージを無視します)

ファンイン

  1. ファンをキューで消費する
  2. 取引中
    • テーブル エントリ (単純なキャッシュの候補) を取得し、
    • タスク インデックスに対応する配列のビットを 1 に設定します (既に 1 だった場合は、二重処理です。そのまま続行します)。
    • completeCount をインクリメントします。
    • if completeCount == fanoutCount ファイナライズ ジョブをキューに入れる
    • トランザクションをコミットする
  3. 注: 同時実行。エントリは、非常に多くのトランザクションしか実行できません。ロジック自体は単純ですが。同時実行性が低い (またはまったくない) バッチ メッセージの処理を検討してください。特に、一度に 1 つのファンアウトしか実行していない場合
于 2014-12-12T19:39:27.563 に答える
0

各バッチが完了するのを待つと、プロセスがよりシリアルになります。そのように実行するには時間がかかります。

多数の varargs が問題である場合、回避策として、ファンアウトが一度に約 10 を超えるタスクを分岐しないと仮定して、各ファンアウトに対応するファンイン タスクを使用できます。

于 2013-08-28T19:59:58.107 に答える