3

对 Windows 工作流程的东西有点新,所以很容易:)

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

我正在寻找一种模式,通过这种模式我可以基于一些外部事件异步创建新的工作流实例(即,一些数据由不同的应用程序在 DB 中更新)。对于每个事件,我都需要准确地创建一个工作流实例,而不管该实例是在哪个主机上创建的。关于事件之间的持续时间和实际创建工作流实例的时间也有一些灵活性。

我正在考虑的一种解决方案是在 WF 主机上使用 WCF 接口,并将它们放在某种负载平衡器后面。然后由系统的任何部分触发“事件”来进行 WCF 调用。

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

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

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

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

任何见解将不胜感激。

附录

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

MSDN 关于 WF 可靠性和高可用性的文章

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

4

3 回答 3

1

如果将 WCF 服务与 netMsmqBinding 一起使用,则无需轮询即可接收排队的消息。如果没有服务运行来接收消息,消息将等待。如果主排队机出现故障,您可能需要确保使用集群队列以提高可靠性。

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

于 2008-09-17T21:07:09.217 回答
0

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

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

于 2008-08-14T15:56:19.490 回答
0

这就是我解决它的方法。

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

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

于 2008-11-02T16:55:44.120 回答