【问题标题】:MSMQ thottling with AppFabric hosted WF使用 AppFabric 托管的 WF 进行 MSMQ 调整
【发布时间】:2012-11-23 07:20:02
【问题描述】:

场景:在 AppFabric 中托管的 WF 服务。 MSMQ 传输。节流设置为高值。 MaxConcurrentCalls 为 64。

客户端一次发送 3000 个请求。

问题:MSMQ 侦听器激活器似乎不遵守节流限制,一旦当前执行的实例数量增加,就会开始引发有害消息异常。

我稍后会尝试通过将 WF 实例设置为在空闲时立即卸载来解决此问题,这应该会有所帮助。是否有任何方法可以配置激活器以处理这些限制,或者任何更可靠的解决方案?

【问题讨论】:

  • 您的<serviceThrottling/> 设置是什么?

标签: workflow-foundation-4 msmq appfabric


【解决方案1】:

其中一个原因可能是长时间运行的工作流程(5 秒以上)造成的。

MSMQ 适配器从队列中批量读取消息并推送到工作流中,快速饱和容量并导致超时和多次投递尝试,从而导致毒消息。

要确保的一件事是,在您的服务限制设置中,最大实例数 > 最大调用数,例如:

 <serviceThrottling 
       maxConcurrentCalls="5"
       maxConcurrentInstances="10" /> 

【讨论】:

  • maxConcurrentInstances(和 Sessions)当前设置为 20000。这是因为我正在处理日终 CSD 交易,而 20000 大约是我们的每日限额。 maxConcurrentCalls 是 64,因为这是默认值(16x4 处理器),它小于 100,这是默认的连接字符串 MaxPoolSize 连接限制。我希望 MQ 激活器遵守 maxConcurrentCalls 限制。立即卸载实例似乎不可靠,并且还会导致持久性问题(我今天发现)。我想知道在这种情况下是否有一种配置激活器的方法
  • 我想知道的另一个途径是 BufferedReceive 行为的最大待处理消息限制。如果我将最大挂起消息限制设置为 64,则重试的排队消息将分批移至锁定队列 64 .....这可以避免破坏 maxConcurrentCalls 并避免向异常发送垃圾邮件日志?
  • 恐怕我的理解明显不如你。抱歉,帮不了你了。
  • SMSvcHost.exe.config 有 net.pipe 和 net.tcp 但没有 net.msmq 的部分 - 一定有一些未记录的内容
【解决方案2】:

WF 仅在 Receive-SendReply 范围内遵守 MaxConcurrentCalls 限制(即 WCF 调用仍在进行中)。由于您使用 MSMQ 绑定并因此使用单向调用(仅接收),因此 MaxConcurrentCalls 基本上是无关紧要的。

使用 MaxConcurrentInstances 来控制有多少工作流正在运行/在内存中。 20000 似乎太高了。

【讨论】:

    猜你喜欢
    • 2015-08-26
    • 2023-03-27
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多