我正在处理一个系统,我必须跟踪几千个并行对象的状态,每分钟发送几次可能的状态更新。此外,我必须执行额外的计算(没有缓慢的IO东西,只使用CPU)。
我目前使用自定义状态机实现。然而,由于WF在系统的其他部分中使用,我想知道WF状态机是否适合具有少数(<5)状态的这种情况。
我担心在性能方面,开销可能过大。由于MS文档并未真正涵盖有关WF状态机性能的主题,我想知道某些SO成员是否有某些信息或资源来重新获得WF状态机的性能?
问候 学家
答案 0 :(得分:5)
状态机非常适合高性能系统。如果你真的需要非常高的性能,使用工作流基础会增加很多复杂性和开销。我发现biztalk完全不适合非常高的性能。
答案 1 :(得分:5)
如果您正在寻找基于.Net的高性能状态机,我建议Stateless。以下是项目网站的摘录:
支持大多数标准状态机构造:
还提供了一些有用的扩展程序:
配置如下:
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或string来表示状态和触发器,从而可以非常轻松地与数据库或ORM集成。美妙之处在于,您不必担心额外的运行时主机,只需从对象或记录中加载具有当前状态的状态机,您就可以了。
答案 2 :(得分:1)
微软目前正在他们的服务器产品中使用WF,他们正在扩展它。例如,可以在Share Point Server(MOSS)和BizTalk Server中找到WF引擎。两者都可以很好地扩展并允许横向扩展方案 - 例如,如果您需要更多计算能力,则可以在负载平衡群集中添加更多(廉价)硬件。
HTH, 托马斯
答案 3 :(得分:1)
这并不直接与性能有关,但如果您计划最终转移到WF 4.0,您应该知道StateMachineActivity可能won't be making the cut。