6

我目前正在处理一个系统,我必须并行跟踪数千个对象的状态,这些对象每分钟发送几次可能的状态更新。此外,我必须执行额外的计算(没有慢 IO 的东西,只使用 CPU)。

我目前使用自定义状态机实现。但是,由于 WF 在系统的其他部分中使用,我想知道 WF 状态机是否适用于具有少数(<5)状态的场景。

我担心在性能方面开销可能太大。由于 MS 文档并没有真正涵盖有关 WF 状态机性能的主题,我想知道一些 SO 成员是否有一些关于 WF 状态机性能的信息或资源?

关于 j。

4

4 回答 4

5

状态机非常适合高性能系统。如果你真的需要非常高的性能,使用工作流基础会增加很多复杂性和开销。我发现 biztalk 完全不适合非常高的性能。

于 2009-08-20T21:39:08.127 回答
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 或 string 来表示状态和触发器,从而使您可以非常轻松地与数据库或 ORM 集成。美妙之处在于,您无需担心额外的运行时主机,只需从对象或记录中加载具有当前状态的状态机即可。

于 2010-01-26T23:44:25.207 回答
1

Microsoft 目前正在其服务器产品中使用 WF,并且他们正在对此进行扩展。例如,WF 引擎可以在 Share Point Server (MOSS) 和 BizTalk Server 中找到。两者都可以很好地扩展并允许扩展场景 - 即,如果您需要更多计算能力,您可以在负载平衡集群中添加更多(便宜)硬件。

HTH,托马斯

于 2009-08-20T13:36:02.393 回答
1

这并不直接涉及性能,但如果您计划最终迁移到 WF 4.0,您应该知道 StateMachineActivity 可能不会成功

于 2009-08-21T02:10:58.840 回答