2017-09-24 92 views
1

我有一份工作可以分解爲更小的任務,每個任務可能需要30分鐘才能完成。任務完成後,必須運行清理任務。完成任務的服務結構任務隊列

enter image description here

每個任務是必須在單獨的機器上運行的CPU密集型操作。

問題是,我找不到一種方法來知道所有任務何時完成。如何在Service Fabric中創建應用程序,以便在所有任務完成後可以運行額外的清理任務?

此外,我該如何做到這一點,當任何任務失敗或意外關閉,取消信號發送到所有工人,然後調用清理任務?

+0

什麼過程開始這些任務。他們將在另一個節點上運行?使用什麼服務?我們在談論C#「任務」嗎?服務結構如何適合您的圖像? –

+0

作業從外部服務開始。任務必須在單獨的工作人員上執行。例如,一個場景可能涉及10個作業,每個作業有100個任務,在40個節點的服務結構實例上。每個節點一次只能執行一項任務。工作人員將首先完成工作#1,然後是下一個40的前40個任務,最後執行最後的20個任務,並開始接下來的20個任務。 – Nican

回答

4

您也可以根據您的要求使用ServiceFabric Actor。

  • 創建一箇中央「JobService」被觸發做的工作(例如,在承載的WebAPI無狀態的服務)
  • 創建「TaskActor」將要處理一個任務
    • 發表一個的CancellationToken在ActorInterface
  • 在你的「JobService」,給每一個任務的唯一ID,並以此作爲「的actorId」
  • 在你的「JobService」,等待演員完成任務並在完成後觸發清理。如果其中一個參與者引發異常,您也可以取消其他參與者。

你可以看看分區的概念,看演員是如何分佈在你的節點上的。

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

根據你的情況下,actorIds可能是一致的(例如taskActor1,taskActor2)再利用的資源,或者你可以使用一個GUID,使他們獨特的每一項工作。

2

考慮使用事件驅動(或pub/sub)的方法。

「開始任務」可以通知預計有多少個子任務。每完成的任務都可以觸發一個事件。清理任務可以等待啓動事件和所有完成事件。清理完成後,如果需要,它可以通知監聽器本身。

以類似的方式,事件可以包含有關進度,失敗和取消的信息。