2009-08-19 11 views
6

Tôi hiện đang giao dịch với một hệ thống mà tôi phải theo dõi trạng thái cho hàng nghìn đối tượng song song có thể gửi cập nhật trạng thái có thể vài lần mỗi phút. Ngoài ra tôi phải thực hiện tính toán bổ sung (không có công cụ IO chậm, chỉ sử dụng CPU).Windows Workflow Foundation Statemachines có phù hợp với các kịch bản hiệu suất cao không?

Tôi hiện đang sử dụng cài đặt máy trạng thái tùy chỉnh. tuy nhiên, vì WF được sử dụng trong các phần khác của hệ thống, tôi tự hỏi liệu máy trạng thái WF có phù hợp với kịch bản như vậy với một số ít (< 5) của các trạng thái hay không.

Tôi lo ngại rằng chi phí có thể quá lớn khi nói đến hiệu suất. Vì tài liệu MS không thực sự đề cập đến các chủ đề liên quan đến hiệu năng cho các máy trạng thái WF, tôi tự hỏi liệu một số thành viên SO có một số thông tin hoặc tài nguyên xem lại hiệu năng máy trạng thái WF không?

liên quan j.

Trả lời

5

Máy trạng thái tuyệt vời cho hệ thống hiệu suất cao. Nếu bạn thực sự cần hiệu suất rất cao bằng cách sử dụng nền tảng công việc, hãy thêm rất nhiều sự phức tạp và chi phí. Tôi đã tìm thấy biztalk hoàn toàn không phù hợp với hiệu suất rất cao.

1

Microsoft hiện đang sử dụng WF trong các sản phẩm máy chủ của họ và họ đang mở rộng điều này. Vì vậy, ví dụ như công cụ WF có thể được tìm thấy trong Share Point Server (MOSS) và trong BizTalk Server. Cả hai quy mô khá tốt và cho phép mở rộng các kịch bản - tức là bạn bổ sung thêm phần cứng (giá rẻ) vào một cụm cân bằng tải nếu bạn cần thêm sức mạnh tính toán.

HTH, Thomas

1

Điều này không trực tiếp nói đến hiệu suất, nhưng nếu bạn dự định chuyển sang WF 4.0, bạn nên lưu ý rằng StateMachineActivity có khả năng là won't be making the cut.

5

Nếu bạn đang tìm kiếm máy tính trạng thái hiệu suất cao dựa trên Net. Tôi sẽ giới thiệu Stateless. Dưới đây là một đoạn trích từ khu vực dự án:

Hầu hết các cấu trúc máy trạng thái tiêu chuẩn được hỗ trợ:

  • Generic hỗ trợ cho các quốc gia và trigger của bất kỳ loại NET (con số, chuỗi, enums vv)
  • bang Hierarchical Mới tốt nghiệp/exit sự kiện cho các quốc gia
  • khoản Guard để hỗ trợ có điều kiện chuyển
  • Mẫn

Một số phần mở rộng hữu ích cũng được cung cấp:

  • Khả năng lưu trữ nhà nước bên ngoài (ví dụ: trong một sản phẩm được theo dõi bởi LINQ to SQL)
  • parameterised gây
  • bang reentrant

Cấu hình như sau:

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); 

Và điều tốt đẹp là vì nó thực hiện Generics, bạn có thể sử dụng int hoặc chuỗi đại diện cho tiểu bang và trình kích hoạt, cho phép bạn tích hợp rất dễ dàng với cơ sở dữ liệu hoặc ORM của bạn. Vẻ đẹp là không có máy chủ thời gian chạy bổ sung mà bạn phải lo lắng về, chỉ cần tải máy trạng thái với trạng thái hiện tại từ một đối tượng hoặc một bản ghi và bạn tốt để đi.