Windows Azure和其他NLB环境中的WF4 Affinity

我使用的是Windows Azure和WF4,我的工作流服务托管在网络角色(带有N个实例)中。 我现在的工作是找出如何做一个亲和力,以我可以发送消息到正确的工作流实例的方式。 为了解释这种情况,我的工作流程(附件)以“StartWorkflow”接收活动开始,创建3个“Person”,并在每个并行中等待这3个人的确认(“ConfirmCreation”接收活动)。

然后我开始搜索如何在其他NLB环境中创建亲和性(主要查找有关Windows Server AppFabric如何工作的信息),但我没有找到确切的答案。 那么它是如何在其他NLB环境中完成的呢?

我的下一个任务是了解如何实现一个系统来处理Windows Azure上的这种关联性,以及此解决方案花费多少钱(价格,时间和工作量),看看它是否可行,还是仅使用一个web角色实例,同时我们等待Azure AppFabric的WF4主机。 我发现的唯一方法是坚持工作流实例。 还有其他的方法吗?

我的第三项任务是确定WF4如何处理同时收到的多个消息。 在我的情况下,这意味着如果3个人同时确认并且同时收到确认消息,它将如何处理。 由于这个问题最合理的答案似乎是使用一个队列,我开始寻找有关WF4队列的信息,并发现有人在讲MSQM。 但是什么是本地WF4消息处理程序系统? 这个处理程序真的是一个队列还是另一个系统? 这种并发性如何处理?


你不应该需要任何亲和力。 事实上,这是持久工作流程的关键点。 虽然您的工作流程正在等待此确认,但应该从任何一台服务器上进行保存和卸载。

就Windows Azure的持久性而言,您需要破解标准的SQL持久性脚本,以便它们可以在SQL Azure上工作,或者编写您自己的位于Azure存储之上的InstanceStore实现。 我们为Azure中运行的工作流完成了后者,但我无法共享代码。 在1到10的努力范围内,我会将它排在8位左右。

就多条消息而言,会发生什么情况是消息将一次接收并传递到工作流实例一条消息。 现在,这些消息中的每一个都可能发送到同一台服务器,或者每个消息都可能会发生差异。 服务器。 无论如何发生,工作流运行时将尝试从实例存储中加载工作流,查看它当前是否已锁定并阻止/重试,直到工作流可用于处理下一条消息。 因此,只要正确配置所有内容并且InstanceStore实现正在完成其工作,您就不必担心对同一工作流实例的并发访问。

以下是其他一些建议:

  • 确保在SendReply活动中使用PersistBeforeSend选项
  • 配置以下工作流服务选项
  • <workflowIdle timeToUnload="00:00:00" />
  • <sqlWorkflowInstanceStore ... instanceLockedExceptionAction="AggressiveRetry" />

  • 使用即开即用的SQL实例存储和SQL Azure在Azure 1.3 SDK作为每个部署时都有点问题,即使您对代码进行了0次更改,也会导致新的服务部署,这意味着已经存在的工作流可以不会继续。 这是一个可以解决的错误,但现在是PITA。

    正如Drew所说,您的工作流实例只需根据需要从服务器移动到服务器,无需将其固定到特定计算机上。 即使你能这样做,也会损害可扩展性和可靠性,所以需要避免。

    使用WCF NetMsmqBinding通过MSMQ发送消息就可以。 内部WF使用称为书签的完全不同的机制,允许工作流程停止并恢复。 每个Receive活动以及其他一些类似Delay的项目将创建一个书签并等待恢复。 您只能恢复现有的书签。 即使恢复书签也不是直接操作,而是由工作流调度程序放入内部队列中,而不是MSMQ,并通过SynchronizationContext执行。 您无法控制调度程序,但可以在使用WorkflowApplication时替换SynchronizationContext,从而获得对如何以及在何处执行活动的控制权。

    链接地址: http://www.djcxy.com/p/61521.html

    上一篇: WF4 Affinity on Windows Azure and other NLB environments

    下一篇: Thoughts and Experiences with Workflow Foundation 4