2017-09-24 19 views
1

私は小さなタスクに分割することができます。それぞれのタスクは完了までに最大30分かかる場合があります。タスクが完了したら、クリーンアップタスクを実行する必要があります。完了タスクを含むサービスファブリックタスクキュー

enter image description here

の各タスクには、別のマシン上で実行する必要がありますCPU集中型の操作です。

問題は、すべてのタスクが完了したときを知る方法が見つからないということです。どのようにしてすべてのタスクが完了したら、追加のクリーンアップタスクを実行できるように、サービスファブリックでアプリケーションを作成できますか?

さらに、タスクが失敗したり予期せずシャットダウンした場合、キャンセルシグナルがすべてのワーカーに送信され、次にクリーンアップタスクが呼び出されるようにするにはどうすればよいですか?

+0

これらのタスクを開始するプロセスは何ですか。別のノードでどこで実行されますか?どのサービスを使用していますか?私たちはC# 'タスク'について話していますか?サービスファブリックはイメージにどのように適合していますか? –

+0

ジョブは外部サービスから開始します。タスクは別のワーカーで実行する必要があります。たとえば、シナリオでは、40個のノードのサービスファブリックインスタンス上に10個のジョブ、100個のタスクを持つ各ジョブが含まれている場合があります。各ノードは、一度に1つのタスクしか実行できません。作業者はまず、ジョブ#1の最初の40個のタスクを実行し、次の40個のタスクを実行し、最後に20個のタスクを実行し、次のジョブのために次の20個のタスクを開始します。 – Nican

答えて

4

あなたの要件にServiceFabric Actorsを使用することもできます。

    • が公開単一のタスクを処理すること「TaskActor」を作成し、作業を行うためにトリガされ、中央「JobService」(WEBAPIをホストするなどステートレスサービス)
    • を作成します。あなたの「JobService」でActorInterface
  • でcancellationToken、待つ、すべてのタスクに一意のIDを与え、あなたの「JobService」で「アクターID」
  • としてこれを使用しますタスクを完了し、すべてが完了したらクリーンアップを開始するアクター。他のアクタの1つが例外をスローすると、他のアクタを取り消すこともできます。

パーティションの概念を見て、アクターがどのようにノードに広がっているかを見ることができます。

https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-reliable-actors-platform#service-fabric-partition-concepts-for-actors

あなたのシナリオに応じて、アクターIDが一致している可能性があり(例えばtaskActor1、taskActor2)資源を再利用するために、またはあなたがすべての仕事のためにそれらを一意にするためにGUIDを使用することができます。

2

イベントドリブン(またはpub/sub)アプローチを使用することを検討してください。

「開始タスク」は、いくつのサブタスクが予想されるかを通知できます。すべての完了したタスクはイベントを発生させることができます。クリーンアップ・タスクは、開始イベントとすべての完了イベントを待つことができます。クリーンアップ後、必要に応じてリスナー自身に通知することができます。

同様に、イベントには進行状況、失敗、キャンセルに関する情報を含めることができます。

関連する問題