私はシンプルなワークフローを実行する必要があるシステムを持っています。 例:オブジェクトのZ Azureテーブルストレージを備えたワークフローシステム
- トリガされると、オブジェクトのZは、1月3日に実行するためのいくつかのコード(実装の詳細は重要ではない)
- スケジュールタスクBを実行します10:25(など)
ワークフロー自体は単純ですが、500.000以上のインスタンスを実行する必要があり、それは難しい部分です。
私はWindows Workflow Foundationを知っています。これと同じ理由で、私はこれを使用しないことにしました。
私の最初のデザインはAzure Table Storageを使用することですが、デザインに関するフィードバックをいただければ幸いです。
システムは、アイデアは実行テーブルは、オブジェクトごとにジョブの完全な履歴を持つことになりますし、タイムテーブルは、将来的に実行するために、すべてのジョブのリストを持っているということである二つのテーブル
Table "Jobs"
PartitionKey: ObjectId
Rowkey: ProcessOn (UTC Ticks in reverse so that newest are on top)
Attributes: State (Pending, Processed, Error, Skipped), etc...
Table "Timetable"
PartitionKey: YYYYMMDD
Rowkey: YYYYMMDDHHMM_<GUID>
Attributes: Job_PartitionKey, Job_RowKey
で構成されます。
いくつかの仮定:
は-
キュー
にメッセージを投稿システムは、これらのタスクを実行できなければなりません:
を持つ「時刻表」にすべてのレコードの保留中のジョブ
- クエリの実行"パーティション< =今日"と "RowKey < =今日"
- 各レコード(並行して)PartitionKeyとのrowKey
- 経由
- ジョブテーブルのルックアップジョブ「が存在しない」または国家ならば!=「ロジック」を実行
- をスキップし、その後保留中。失敗した場合、単一のトランザクションとして
「をアップデート状態=加工」と「新規ジョブの記録(次の実行)」を提出
- 「タイムテーブルに次の実行日を」送信=>ログインして、おそらくいくつかの再試行ロジックを行う
- 2つだけ変更がトランザクション内にある3つのレコードのすべてが終了すると
- =>すべて処理さ時間割が
懸念を記録し削除します。これはどんなやり方で克服できますか?PartitionKey
によってジョブテーブル内のオブジェクトのZ
- クエリのトップ1のジョブの
ストップワークフロー 停止/一時停止のワークフロー
- 任意および国家==場合は、 "キャンセル" に更新して保留中
- (時間が来ると、それは自分自身をきれいにします)時間表をクリーニングする必要はありません。
スタートワークフロー
- ジョブテーブルに保留中のレコードを作成します
- 「の事を実行する」という点で
は私が Azureの機能を使用することになりタイムテーブルにレコードを作成しますか、保留中のジョブを5分ごとに実行するScheduler-thing。
ご意見やご提案をいただければ幸いです。
ありがとうございます!
Oooh la la。どのようなサービスバスの素晴らしい機能。私はそれができることを知らなかった。これは効果的に私の "タイムテーブル"を置き換えます!また、それは1つのエンティティグループトランザクションですべてを得るのに役立ちます:)私はサービスバスで遊ぶことを楽しみにしています。その方向に私を押してくれてありがとう –