如何基于外部事件可靠地创建工作流实例?

时间:2008-08-14 14:56:30

标签: .net workflow workflow-foundation

对Windows工作流程有点新鲜,所以请轻松一下:)

我希望设计一个具有高可用性的工作流主机环境 - 在单独的硬件上至少有2个WF运行时主机,这些主机指向相同的持久性或跟踪SQL数据库。

我正在寻找一种模式,我可以根据某些外部事件异步创建新的工作流实例(即某些数据由不同的应用程序在DB中更新)。对于每个事件,我需要创建一个工作流实例,并且无关紧要在哪个主机上创建该实例。关于事件与实际创建工作流实例之间的持续时间,还有一些灵活性。

我正在考虑的一个解决方案是在WF主机上安装WCF接口并将它们置于某种负载均衡器之后。然后由系统中触发“事件”的任何部分来进行WCF调用。

我对此并不满意,因为如果所有WF主机都关闭或者不可用,则该事件可能会“丢失”。此外,我将无法按照我想要的方式管理负载。我设想的情况是在很短的时间内可能会发生很多事件,但是稍后处理这些事件是完全可以接受的。

所以我认为我需要以某种方式坚持事件并将事件创建与事件处理分离。

将这些事件放入MSMQ或SQL Server中的简单事件表中,让WF主机定期轮询队列是否可行?虽然投票似乎是一个如此肮脏的词......

NServiceBus和持久消息传递在这里会有用吗?

非常感谢任何见解。

附录

数据库将与共享光纤通道存储集群。网络也将是多余的。为了使WF运行时实例具有故障转移,它们必须指向公共持久性服务,在这种情况下,它是SQL后端。它的可用性很高,而不是Total Availabilty:)

MSDN article on WF Reliability and High Availabilty

此外,WF运行时的每个实例必须运行完全相同的位,因此升级将需要同时将它们全部关闭。如果需要的话,我喜欢能够做到这一点的想法,而不需要整个系统。

3 个答案:

答案 0 :(得分:1)

如果您使用带有netMsmqBinding的WCF服务,则无需轮询即可接收排队的消息。如果没有服务正在运行,消息将等待以获取它们。在主排队机器出现故障时,您可能希望确保使用群集队列来确保可靠性。

升级时也要注意,您无法从旧版本的服务中恢复实例。因此,要升级长时间运行的工作流,您需要阻止它们接收新请求并等到所有实例都完成后再更改位,否则旧实例将永远停留在持久性存储中。

答案 1 :(得分:0)

我会选择MSMQ /事件表。如果你做错了,轮询只会很脏。

要记住一件事:你说你想要多个WF服务器以实现高可用性,但是它们都使用相同的SQL后端?高可用性仅在您删除所有单点故障时才有效,而不仅仅是部分故障点。

答案 2 :(得分:0)

这就是我解决它的方法。

我正在使用NServiceBus并且每个WF运行时主机指向相同的messagebus(使用MSMQ作为传输)。 NServiceBus支持消息总线和回滚的事务读取。如果消息从总线上取下,但进程在消息完全处理之前终止,它将保留在队列中,而另一个运行时主机将接收它。

为了让WF运行时主机在不同的机器上运行,messagebus \ queue必须驻留在Windows 2008服务器(MSMQ 4.0)或更高版本上,因为早期版本的MSMQ不支持远程事务读取。另请注意,为了执行远程事务读取,执行读取的计算机还需要安装MSMQ 4.0(即Windows Server 2008)