Rebus与MSMQ:交货时间不稳定

时间:2014-09-23 08:24:52

标签: rebus

我们将Rebus与MSMQ一起用于应用程序组件之间基于消息的通信。这些组件都在同一台机器上运行。

发送和接收消息之间的时间通常保持在一秒以下。但是,如果系统闲置一分钟左右(意味着没有消息被发送),则下一个或两个消息有时需要大约五秒钟才能发送。 MSMQ性能计数器显示这些消息在此期间保留在队列中。

对于我们的应用程序,消息需要具有恒定的传递时间(低于一秒)。

这种行为可能是什么原因? 有没有办法影响MSMQ或Rebus中消息的传递时间? 我们应该选择其他运输方式来获得更稳定的交货时间吗?

2 个答案:

答案 0 :(得分:3)

默认情况下,Rebus会根据BackoffBehavior中的时间间隔逐渐退出对队列的轮询 - 正如您所看到的,如果队列闲置的时间足够长,它将每5秒轮询一次队列。< / p>

您可以通过

更改为低延迟退避策略
Configure.With(...)
    .(...)
    .Behavior(b => b. SetLowLatencyBackoffBehavior())
    .(...)

在配置法术中。


更新:在Rebus的更高版本中(即版本&gt; = 2),可以像这样自定义退避时间:

Configure.With(...)
    .(...)
    .Options(o => {
        o.SetBackoffTimes(
            TimeSpan.FromMilliseconds(100),
            TimeSpan.FromMilliseconds(200),
            TimeSpan.FromSeconds(1)
        );
    })

在这种情况下,在运行空闲的前两秒内以100 ms和200 ms的间隔进行轮询,然后在其余时间以1 s的间隔进行轮询。

如果此级别的自定义功能不足,则可以通过上面ISyncBackoffStrategy配置器中的o.Register<ISyncBackoffStrategy>(c => new YourOwn SyncBackoffStrategy())来实现和使用.Options

答案 1 :(得分:1)

据我记忆,当Rebus注意到队列中没有消息时,它会逐渐增加它在下一次偷看之前等待的秒数。

你提到的5秒似乎很好地与我之前经历的最长等待时间相对应,当我运行Rebus并登录DEBUG模式时(你可以看到它增加了时间)。