场景:在 AppFabric 中托管的 WF 服务。MSMQ 传输。节流设置为高值。MaxConcurrentCalls 为 64。
客户端一次发送 3000 个请求。
问题:MSMQ 侦听器激活器似乎不遵守限制限制,一旦当前执行的实例数量增加,就会开始引发有害消息异常。
稍后我将尝试通过将 WF 实例设置为在空闲时立即卸载来解决此问题,这应该会有所帮助。有没有办法配置激活器来处理这些限制,或者任何更可靠的解决方案?
场景:在 AppFabric 中托管的 WF 服务。MSMQ 传输。节流设置为高值。MaxConcurrentCalls 为 64。
客户端一次发送 3000 个请求。
问题:MSMQ 侦听器激活器似乎不遵守限制限制,一旦当前执行的实例数量增加,就会开始引发有害消息异常。
稍后我将尝试通过将 WF 实例设置为在空闲时立即卸载来解决此问题,这应该会有所帮助。有没有办法配置激活器来处理这些限制,或者任何更可靠的解决方案?
造成这种情况的原因之一是长时间运行的工作流程(5 秒以上)。
MSMQ 适配器从队列中批量读取消息并推送到工作流中,快速饱和容量并导致超时和多次投递尝试,从而导致毒消息。
要确保的一件事是,在您的服务节流设置中,最大实例数 > 最大调用数,例如:
<serviceThrottling
maxConcurrentCalls="5"
maxConcurrentInstances="10" />
WF 仅在 Receive-SendReply 范围内遵守 MaxConcurrentCalls 限制(即 WCF 调用仍在进行中)。由于您使用 MSMQ 绑定并因此使用单向调用(仅接收),因此 MaxConcurrentCalls 基本上是无关紧要的。
使用 MaxConcurrentInstances 来控制有多少工作流正在运行/在内存中。20000 似乎太高了。