2017-09-29 132 views
1

我需要在.net中構建一個動態工作流應用程序,該應用程序基本上允許創建,監視,暫停,重新啓動,保留並動態更新工作流程。工作流的每個節點都是一項要求苛刻的計算任務,可能需要幾個小時,工作流將由至少20個節點組成。在.net中構建工作流應用程序的最佳方式

目前看來,最好的解決方案是使用WF4,但環顧四周,我發現在F#,Orleans或Akka.NET中發現基於代理的編程非常有吸引力來實現工作流程解決方案,與WF4相反沒有太多的學習內容。開始使用基於代理的編程解決方案是否是一個好主意,還是應該繼續使用WF4?

+0

他們真的是不同的東西,我不是很熟悉WF4的呃......我個人會從WF4開始,「這可能需要幾個小時」聽起來像生活在工作流世界中的東西,所有「long running transatction」類型的花裏胡哨 – user2088029

+0

看起來WF4有一個分歧的觀點:https://stackoverflow.com/questions/104099/when-to-use-windows-workflow-foundation(看第二個答案)和https://stackoverflow.com/questions/513657/why-use-windows-workflow – Mario

回答

2

<edit>

要回答你的問題上建立一個基於代理的模式,即在我看來,最好的辦法。它使調試和維護變得更容易,同時分離出整個操作的「驅動程序」(即,您可以換出WF並用另一個設備替換它)。

</edit>

WF4可用於驅動您的長時間運行的業務邏輯。我使用的最佳方法是一個簡單地啓動「代理進程」的工作流程,並且在代理正在工作時,WF實例休眠等待被代理喚醒。

概括地說,像這樣的方法:

  • 有一個「編排」的過程,負責啓動新的工作流程和保溼堅持工作流程。
  • 並有一個「代理」進程(或進程),實際上運行你長時間運行的任務。

的編排流程

這個過程是充電開始一個全新的流實例的。您的工作流程只需啓動代理程序即可完成實際工作。工作流實例會休眠。

此過程還會等待恢復休眠工作流實例的請求。從本質上講,工作流實例只會「運行」很短的時間,並將實際工作委託給其他線程/進程。

實施編排流程的一種方式是作爲Web服務。代理程序完成後,代理程序可以輕鬆回調它以喚醒沉睡的工作流程實例。

在代理過程中

這個過程中會有執行工作的實際訣竅。當由編排過程調用時,會給它一些信息以知道應該執行哪個上下文(即業務對象)。完成後,代理通知編排流程已完成。

回到編排流程

當代理完成了它的任務,它使一個電話回編排流程的情況下準備繼續前進到下一項在流動。然後,編排過程將水合該上下文的工作流程,並恢復它。

工作流程可能會決定另一個長時間運行的任務接下來啓動,從而激活另一個代理程序進程以委託任務,然後再次休眠該工作流程實例。此循環將繼續,直到工作流實例結束。

「動態」工作流部分

我想你指的是更新的「正在進行中」的工作流程,對不對?如果是這樣,WF4.5有這個能力。我從來沒有實現過(但),但從我讀過的內容來看,這是可行的。

該概念涉及添加一些關於您正在執行的工作流版本的元數據。 WF將負責啓動一個動態活動更新,您可以通過它進行協調。

+0

謝謝,我想我明白你的觀點。就我而言,工作流的節點將主要是R腳本,我將需要包裝以提供一些選項。然後我需要提供工作流程的編排。我的觀點是,即使WF提供了非常好的功能(持久性和動態更新),它看起來並不友好。那麼,僅僅使用WF來處理orchastration部分還是應該使用其他類似Akka.Net的東西? – Mario

+0

有一個學習曲線來拾取WF,但它並不瘋狂棘手。光明的一面是它提供了很多開箱即用的功能,這是一個巨大的優勢。警告是一些文檔狩獵,如果需要某些功能。有很多關於它的各種事情的博客,所以這些日子還是很有幫助的。我說如果你能找到你可能使用它的功能的文檔,那就去做吧。 – ajawad987

+0

@ ajawad987的這種「編排」思想是殺手鐗,它使用WF來實現它:長時間運行的進程/事務。有了它,你可以避免大部分痛苦的部分(編寫自定義活動等)。當大多數邏輯都在WF之外(在「代理」中)時,您不需要經常刷新WF,它只是長時間運行過程的主幹。本週的一部分是可擴展性和存儲:我創建了一個github項目,將WF移植到Orleans,Orleans提供存儲,調度程序並提供可擴展性和可移植性。 https://github.com/OrleansContrib/Orleans.Activities – lmagyar

相關問題