代码之家  ›  专栏  ›  技术社区  ›  Joachim Kerschbaumer

Windows工作流基础状态机适用于高性能场景吗?

  •  6
  • Joachim Kerschbaumer  · 技术社区  · 15 年前

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

    我目前使用自定义状态机实现。但是,由于WF在系统的其他部分中使用,我想知道WF状态机是否适用于这样一种情况,其中有少量的状态(<5)。

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

    当做 J

    4 回复  |  直到 10 年前
        1
  •  5
  •   Jay    15 年前

    状态机对于高性能系统来说是非常好的。如果你真的需要非常高的性能使用工作流基金会增加了很多的复杂性和开销。我发现Biztalk完全不适合非常高的性能。

        2
  •  5
  •   David Robbins    14 年前

    如果您要查找基于.NET的高性能状态机,我建议您 Stateless . 以下是项目现场的摘录:

    支持大多数标准状态机构造:

    • 对州和 任何.NET类型的触发器(数字, 字符串、枚举等)
    • 分级状态进入/退出 州事件
    • 用于支持条件的保护子句 转变
    • 反省

    还提供了一些有用的扩展:

    • 外部存储状态的能力 (例如,在跟踪的属性中 通过LINQtoSQL)
    • 参数化触发器
    • 可重入状态

    配置如下:

    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集成。优点是没有额外的运行时主机需要您担心,只需从对象或记录中加载状态机的当前状态,您就可以很好地完成任务。

        3
  •  1
  •   Tomcat    15 年前

    微软目前正在他们的服务器产品中使用WF,他们正在扩展它。例如,WF引擎可以在共享点服务器(MOSS)和Biztalk服务器中找到。这两种方案都能很好地扩展,并允许扩展场景——即,如果需要更多的计算能力,可以在负载平衡集群中添加更多(便宜)硬件。

    HTH 托马斯

        4
  •  1
  •   lesscode    15 年前

    这并不直接关系到性能,但是如果您打算最终转到WF 4.0,您应该知道StateMachineActivity很可能 won't be making the cut .