2009-08-19 53 views
6

我目前正在處理一個系統,在這個系統中,我必須跟蹤幾千個並行對象的狀態,每分鐘發送幾次可能的狀態更新。此外,我必須執行額外的計算(不使用緩慢的IO東西,只使用CPU)。Windows Workflow Foundation Statemachines是否適用於高性能場景?

我目前使用自定義狀態機實現。然而,由於WF在系統的其他部分中使用,我不知道WF狀態機是否適用於少數幾個州的情況。

我擔心在性能方面的開銷可能太大。由於MS文檔並未涵蓋有關WF狀態機性能的主題,因此我想知道一些SO成員是否擁有一些信息或資源來管理WF狀態機的性能? j)。

關於 j。

回答

5

狀態機是非常適合高性能系統。如果使用工作流基礎確實需要非常高的性能,則會增加很多複雜性和開銷。我發現biztalk完全不適合高性能。

1

微軟目前在他們的服務器產品中使用WF,他們正在擴展這個功能。例如,WF引擎可以在Share Point Server(MOSS)和BizTalk Server中找到。兩者都可以很好地擴展並允許擴展場景 - 即如果您需要更多計算能力,則可以在負載平衡羣集中添加更多(便宜)硬件。

HTH, 托馬斯

5

如果您正在尋找基於.Net的高性能狀態機,我會推薦Stateless。下面是該項目的網站摘錄:

大多數標準狀態機結構的支持:對國家和任何.NET類型的 觸發

  • 通用支持(數字,字符串 ,枚舉,等等。)
  • 分層狀態進入/退出 事件狀態
  • 保護條款,支持有條件的 過渡
  • 自省,還提供

一些有用的擴展:

  • 能力來存儲狀態外部 (例如,在由Linq to SQL跟蹤的 屬性中)
  • 參數化的觸發
  • 折返狀態

配置如下:

var phoneCall = new StateMachine<State, Trigger>(State.OffHook); 

phoneCall.Configure(State.OffHook) 
    .Permit(Trigger.CallDialed, State.Ringing); 

phoneCall.Configure(State.Ringing) 
    .Permit(Trigger.HungUp, State.OffHook) 
    .Permit(Trigger.CallConnected, State.Connected); 

phoneCall.Configure(State.Connected) 
    .OnEntry(() => StartCallTimer()) 
    .OnExit(() => StopCallTimer()) 
    .Permit(Trigger.LeftMessage, State.OffHook) 
    .Permit(Trigger.HungUp, State.OffHook) 
    .Permit(Trigger.PlacedOnHold, State.OnHold); 

// ... 

phoneCall.Fire(Trigger.CallDialled); 
Assert.AreEqual(State.Ringing, phoneCall.State); 

而且好處是,因爲它實現了泛型,你可以使用int或字符串來表示狀態和觸發器,使您可以非常輕鬆地與數據庫或ORM進行集成。美妙之處在於沒有額外的運行時主機,您不必擔心,只需從對象或記錄中加載當前狀態的狀態機,即可。

相關問題