2017-03-28 28 views
0

私はシンプルなワークフローを実行する必要があるシステムを持っています。 例:オブジェクトのZ Azureテーブルストレージを備えたワークフローシステム

  • のため月1日午前8時15トリガタスクAで

    1. トリガされると、オブジェクトのZは、1月3日に実行するためのいくつかのコード(実装の詳細は重要ではない)
    2. スケジュールタスク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 
    

    で構成されます。

    いくつかの仮定:

  • 「仕事」は非常に軽量例えばオブジェクトごとに複数のオブジェクト
  • しか存在します1つの保留中のジョブをまたがることはありません仕事です
    • キュー

    にメッセージを投稿システムは、これらのタスクを実行できなければなりません:

    • を持つ「時刻表」にすべてのレコードの保留中のジョブ

      1. クエリの実行"パーティション< =今日"と "RowKey < =今日"
      2. 各レコード(並行して)PartitionKeyとのrowKey
      3. 経由
        1. ジョブテーブルのルックアップジョブ「が存在しない」または国家ならば!=「ロジック」を実行
        2. をスキップし、その後保留中。失敗した場合、単一のトランザクションとして
      4. 「をアップデート状態=加工」と「新規ジョブの記録(次の実行)」を提出
      5. 「タイムテーブルに次の実行日を」送信=>ログインして、おそらくいくつかの再試行ロジックを行う
      6. 2つだけ変更がトランザクション内にある3つのレコードのすべてが終了すると
      7. =>すべて処理さ時間割が

      懸念を記録し削除します。これはどんなやり方で克服できますか?PartitionKey

    • によって

      ジョブテーブル内のオブジェクトのZ

      1. クエリのトップ1のジョブの
      2. ストップワークフロー 停止/一時停止のワークフロー

      3. 任意および国家==場合は、
      4. "キャンセル" に更新して保留中
      5. (時間が来ると、それは自分自身をきれいにします)時間表をクリーニングする必要はありません。
    • スタートワークフロー

      1. ジョブテーブルに保留中のレコードを作成します
      2. 「の事を実行する」という点で

    は私が Azureの機能を使用することになりタイムテーブルにレコードを作成しますか、保留中のジョブを5分ごとに実行するScheduler-thing。

    ご意見やご提案をいただければ幸いです。

    ありがとうございます!

  • 答えて

    1

    代わりにサービスバスを使用するのはどうですか? BrokeredMessageクラスにはScheduledEnqueueTimeUtcというプロパティがあります。 ScheduledEnqueueTimeUtcプロパティ、fuggedaboudditを使用してジョブを実行するタイミングをスケジュールすることができます。その後、サービスバスメッセージングキューを監視するトリガされたWebジョブを作成し、ジョブメッセージがエンキューされたときに非常に近くにトリガされます。私は、必要なコーディングを最小限に抑えるために、既存のサービスに頼っているという大きなファンです。

    +1

    Oooh la la。どのようなサービスバスの素晴らしい機能。私はそれができることを知らなかった。これは効果的に私の "タイムテーブル"を置き換えます!また、それは1つのエンティティグループトランザクションですべてを得るのに役立ちます:)私はサービスバスで遊ぶことを楽しみにしています。その方向に私を押してくれてありがとう –