Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何基于外部事件可靠地创建工作流实例?_.net_Workflow_Workflow Foundation - Fatal编程技术网

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

.net 如何基于外部事件可靠地创建工作流实例?,.net,workflow,workflow-foundation,.net,Workflow,Workflow Foundation,windows工作流有点新,所以请轻松:) 我希望设计一个具有高可用性的工作流主机环境—在单独的硬件上至少有两个WF运行时主机,都指向相同的持久性或跟踪SQL数据库 我正在寻找一种模式,通过这种模式,我可以基于某个外部事件异步创建新的工作流实例(即,某个数据段由不同的应用程序在数据库中更新)。对于每个事件,我只需要创建一个工作流实例,而不管在哪个主机上创建该实例。在事件与实际创建工作流实例之间的持续时间方面也有一定的灵活性 我正在考虑的一个解决方案是在WF主机上使用WCF接口,并将其置于某种负载

windows工作流有点新,所以请轻松:)

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

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

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

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

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

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

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

任何见解都将不胜感激

附录

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


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

我会选择MSMQ/event table。只有当你做错了,投票才是肮脏的


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

如果使用带有netMsmqBinding的WCF服务,您可以接收排队的消息,而无需轮询。如果没有运行服务来接收消息,消息将等待。您需要确保在主排队机器停机的情况下使用集群队列以提高可靠性


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

我就是这样解决的

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

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