Workflow Management Service
工作流管理服务 (WMS) 是为工作流服务实例提供以下管理服务的 Windows 服务:
激活工作流服务实例。当实例成为可激活状态时,WMS 将激活实例存储中的工作流服务实例。如果实例成为可运行状态并且与实例相匹配的服务主机未在本地计算机上运行,则实例存储中的工作流服务实例将视为可激活。以下列表包含实例成为可运行状态的原因:
在等待要完成和正在完成的延迟活动时,将对实例进行卸载和暂留。
实例加载时,服务主机关闭。
实例上具有已过期的实例锁定。
执行用户控制命令。实例存储的实例控制提供程序将通过 Windows PowerShell 实例控制 cmdlet 接收的命令添加到实例存储的队列中。此队列由实例控制提供程序创建和维护。WMS 检索队列中的命令,执行这些命令,然后如果命令执行成功则从队列中删除命令。
本主题的其余部分详细介绍这些服务。要了解有关 WMS 的配置和安装,请参阅安装和配置 Workflow Management service。
激活工作流服务实例
默认情况下,WMS 将自动发现需要监控可激活工作流实例的实例存储。在服务启动过程中或当配置文件之一更改时,通过扫描根、站点和应用程序级别上的 Web.config 文件来实现发现。也可以指定希望 WMS 监控的特殊实例存储,而不是让其自动发现实例存储。
WMS 将创建 InstanceStore 对象,并为发现的每个实例存储订阅 HasActivatableWorkflowEvent。当实例存储在存储中找到可激活的工作流实例时,实例存储将引发 HasActivatableWorkflowEvent。此后,实例存储将停止监控,直到在存储上某次调用 QueryActivatableWorkflowsCommand。
WMS 收到 HasActivatableWorkflowEvent 时,将针对实例存储来执行 QueryActivatableWorkflowsCommand 以获取用于创建工作流主机的激活参数。
然后,WMS 调用包含服务(服务实例需要激活)的应用程序支持的服务管理服务,并向其传递激活参数。AppFabric 向已启用 serviceManagement 属性的所有应用程序自动添加服务管理服务(WCF 服务)。服务管理服务将公开服务激活终结点,WMS 通过使用该服务构建的地址(使用站点名称、虚拟应用程序路径和已知服务激活终结点地址)访问该终结点。WMS 为此终结点使用 net.pipe 绑定。请参阅服务管理服务获取有关服务的详细信息。
服务管理服务通过使用从 WMS 接收的激活参数来激活工作流服务主机。服务主机创建实例存储(例如 SQL 工作流实例存储)并调用存储中的方法,以将实例存储中的工作流服务实例加载到内存中。
警告
WMS 立即获取对 SQL 工作流实例存储 (SWIS) 行为和配置文件中相应的实例存储定义的任何更改,并开始监控这些存储。但是,应用程序将继续使用原有版本配置文件中的 SWIS 行为中指定的实例存储,直到应用程序域回收。httpRuntime 元素的 delayNotificationTimeout 属性指定时间段后回收应用程序域。例如,如果 delayNotificationTimeout 设置为 5000 (<httpRuntime delayNotificationTimeout = "5000" />),则另外 5000 秒不会回收应用程序域。
警告
如果禁用应用程序或应用程序池(共包含 1000 或更多服务),则 WMS 可能无法再激活任何可激活的服务实例。解决方法是在取消激活或禁用应用程序/应用程序池之前挂起属于这些应用程序/应用程序池的服务实例。
执行用户控制命令
当您使用 Windows PowerShell cmdlet 发布针对工作流服务实例的命令时,实例控制提供程序将向该服务使用的实例存储中的命令队列中添加命令。命令队列由实例控制提供程序维护。
WMS 会自动发现需要监控命令的实例存储。在启动过程中或当配置文件之一更改时,通过扫描根、站点和应用程序级别上的 Web.config 文件来实现发现。WMS 为发现的每个实例存储创建一个实例控制提供程序,并且针对命令定期轮询该提供程序。具体来说,WMS 调用实例控制提供程序上的 BeginTryReceive 方法来接收命令。
实例控制提供程序依次检索命令,但不会将其从实例存储的命令队列中删除,而是将命令返回到 WMS。提供程序会对命令队列中的命令进行短期锁定。
然后,WMS 调用工作流服务主机公开的实例控制终结点 (ICE) 的适当方法,以执行针对目标工作流服务实例的命令。WMS 要求实例控制终结点启用 net.pipe 绑定并启用传输安全。WMS 通过合并站点名称、虚拟服务路径、已知 ICE 路径构建终结点地址。实例控制提供程序提供站点名称和虚拟服务路径信息。ICE 绑定将被硬编码成为 net.pipe 绑定。
如果命令执行成功,WMS 将调用实例控制提供程序上的 Complete 方法,并且该提供程序从命令队列中删除该命令。如果命令执行失败,WMS 将调用实例控制提供程序上有关失败的 Abandon 方法,并由提供程序决定是从命令队列中删除命令,还是将命令保留在命令队列中以便进行更多次重试。在从命令队列中删除命令之前,SQL 工作流实例存储的实例控制提供程序将尝试命令五次。如果 WMS 在执行命令过程中崩溃,则锁定最终将过期,并且稍后该命令可能被同一 WMS 实例或另一个 WMS 实例选取。
如果 Microsoft 分布式事务处理协调器 (MSDTC) 已启用并且 MSDTC 已启用入站和出站通信,则以事务性方式执行实例控制命令。例如,如果挂起工作流服务实例,则该状态显示在 IIS Manager 中,或在命令被处理后作为已挂起立即从 cmdlet 中返回。但是,如果 MSDTC 被禁用或未正确配置,则实例控制命令将以非事务性方式执行。在这种情况下,实例的状态将在实例卸载并暂留在实例存储中之后才会更新为已挂起,因为实例处于空闲的时间已大于指定的时间段(空闲卸载设置)。请注意,如果更改 MSDTC 设置,将需要重新启动 WMS 以便服务获取更新的 MSDTC 设置。
技巧 |
---|
如果您发现一个或多个实例控制命令仍然处于挂起状态并且比您希望的时间长,则应检查 WMS 是否在服务器场中的每个服务器上运行。如果实例当前在特定服务器上运行(根据监控信息)并且未执行为该实例发出的控制命令,则需要检查 WMS 是否在该服务器上运行。 |
警告
如果启用“允许入站”和“允许出站”DTC 设置,则工作流管理服务使用事务处理的命令。如果禁用 DTC,请确保同时明确禁用这些设置,以便将使用非事务性命令。
支持服务器场环境
通常,服务器场中的每个节点均运行一个 WMS 实例。一个 WMS 实例可以监控多个实例存储。节点可以在不同的 Windows 标识下运行多个 WMS 实例。我们建议您为节点上的一个实例存储只运行一个 WMS 实例。如果您在监控同一实例存储的同一节点上运行多个 WMS 实例,则可能遇到可伸缩性问题。
某个节点上早期运行的实例可能被另一个节点上的 WMS 选取,并且在该节点上被激活。这有助于平衡整个服务器场中的 WMS 工作负荷。
当您向工作流实例发出控制命令时,该工作流实例可能(或不可能)在场中的任何地方运行。WMS 将命令提供给运行该工作流的计算机,或指示本地计算机加载工作流并执行命令。这使您可以对实例发出命令,而无需了解实例在哪个计算机上运行。
从属功能
下列几点适用于工作流管理服务 (WMS):
WMS 仅针对 IIS/WAS 环境中使用 WorkflowServiceHost 托管的工作流服务实例激活并执行命令。WMS 不支持使用不同主机或位于不同托管环境中的工作流服务。
WMS 激活为持久状态暂留使用实例存储的工作流服务实例。
WMS 激活属于提供服务管理服务的应用程序的工作流服务实例。WMS 使用服务管理服务激活将从实例存储依次加载实例的服务主机。
WMS 要求将 net.pipe 绑定添加到站点并且在包含该服务的应用程序上启用 net.pipe 协议。如果未在应用程序上启用 net.pipe 协议,则 WMS 将在事件日志中记录错误。
WMS 要求工作流服务实例公开实例控制终结点 (ICE)。WMS 使用此终结点向工作流服务实例发出命令(例如挂起和继续)。
WMS 与实例存储提供程序和实例控制提供程序附带的任何实例存储配合使用。
WMS 要求实例存储在实例变为可激活状态时引发 HasActivatableWorkflowsEvent。
备注
有关 WMS 安全相关的信息,请参阅暂留存储的安全配置。
安全
工作流管理服务 (WMS) 需要连接到由工作流服务主机公开的实例控制终结点 (ICE) 以控制工作流服务实例,以及由 Web 应用程序公开的服务管理终结点以启动工作流服务主机,然后加载工作流服务实例。AS_Administrators 组具有这两个终结点的访问权限。AppFabric 工作流管理服务的安全标识符 (SID) 是此组的成员。因此,无需向 AS_Administrator 组明确添加 WMS 运行时使用的帐户。
以下列表提供用于确保 WMS 使用的实例存储和配置文件安全的指南:
WMS 将配置信息(包括配置文件中的连接字符串)读取到内存中。WMS 此时不处理加密连接字符串,因此该连接字符串必须是简单文本格式。恶意用户可能从内存中访问任何敏感信息(例如连接字符串中的用户名和密码)。因此,不应在配置文件中定义的连接字符串中指定敏感信息。
我们建议您使用 Web.config 文件中存储的连接字符串的集成 Windows 身份验证。如果无法使用集成 Windows 身份验证且在 Web.config 文件中定义的连接字符串中指定了用户名和密码,则需在配置文件上设置相应的 ACL(访问控制列表)。请确保 AS_Administrators 组具有对 WMS 需要访问的 Web.config 文件的访问权限。但您必须知道,设置 ACL 不会阻止恶意用户从内存中访问连接字符串信息。
通过向 SQL 连接字符串添加“;Encrypt=yes”来启用加密的 SQL 通信。如果您使用 SqlConnectionStringBuilder 类构建连接字符串,请将 Encrypt 属性设置为 true。有关启用服务器上的加密通信的详细信息,请参阅 https://go.microsoft.com/fwlink/?LinkID=187283。如果您未在您的应用程序和 SQL Server 安全之间进行通信,则恶意用户可以操作或运行针对 SQL Server 数据库的命令。
命令队列不维护任何凭据信息。成为 AS_Administrator 组成员的用户(映射到 WorkflowAdministrators SQL 角色)有权控制实例存储中的所有实例以及非特定类型的任何实例。因此,不希望由其他用户控制的实例应存储在其他实例存储中,并且这些实例存储的 WorkflowAdministrators SQL 角色应映射到其他 Windows 组中。
每次修改 Web.config 文件时,WMS 都将读取文件并检查是否从文件中添加或删除了存储定义。为防止未经授权的用户触发 WMS 文件处理,我们建议您限制对 Web.config 文件的写入权限。
根据跟踪级别,AppFabric 监控功能将收集大量数据。我们建议您不要在同一数据库中并置监控和暂留存储。从而使监控存储的溢出不会影响暂留子系统。
下表介绍了确保安全访问命令队列和暂留数据库的 SQL 角色。此表中的内容仅适用于 SQL 工作流实例存储。
SQL 角色 | 描述 | Windows 组 |
---|---|---|
WorkflowAdministrators |
此角色的成员可以将命令排列(添加命令)到命令队列(暂留数据库的一部分)中。希望控制实例(例如,通过使用 Windows PowerShell cmdlet)的用户必须是此角色的成员。 |
AS_Administrators |
WorkflowManagementServiceUsers |
此角色的成员可以从命令队列中取消命令排队(检索命令)。WMS 运行时使用的帐户必须是此角色的成员,以便 WMS 可以检索命令队列中存储的命令。 |
AS_Administrators |
WorkflowActivationUsers |
此角色的成员可以激活暂留数据库中暂存的且随时可运行的工作流服务实例。 |
AS_Administrators |
InstanceStoreObservers |
此角色的成员可以查询实例的实例存储并从存储的命令队列中检索命令。 |
AS_Administrators 和 AS_Observers |
InstanceStoreUsers |
此角色的成员可以加载和保存实例。加载和保存操作由运行工作流的服务主机执行。 如果服务 Service1 的实例暂留在实例存储 Store1 中,则运行服务主机的应用程序池 AppPool1 必须在相应标识(在 Store1 上具有用户权限)下运行。 |
IIS_USRS |
有关基于方案的安全相关指南,请参阅暂留存储的安全配置。
另请参阅
概念
暂留存储的安全配置
安装和配置 Workflow Management service
2011-12-05