2014-09-23 49 views
2

我们使用Rebus和MSMQ在应用程序组件之间进行基于消息的通信。这些组件都在同一台机器上运行。带有MSMQ的Rebus:不稳定的交付时间

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

对于我们的应用程序,希望消息具有恒定的交付时间(低于一秒)。

这种行为的原因是什么? 有没有办法影响MSMQ或Rebus中消息的交付时间? 我们应该选择另一种运输类型以获得更稳定的交货时间吗?

回答

3

根据BackoffBehavior中的时间跨度,Rebus默认情况下会逐渐退出轮询队列 - 如您所见,如果闲置足够长时间,它将每5秒轮询一次队列。

您可以通过在配置法术会

Configure.With(...) 
    .(...) 
    .Behavior(b => b. SetLowLatencyBackoffBehavior()) 
    .(...) 

更改为低延迟退避策略。


更新:在100毫秒和200毫秒的间隔这种情况下轮询

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

:在Rebus的更新版本(即版本> = 2)的退避时间可定制这样持续空闲的前两秒钟,然后在剩下的时间以1秒为间隔。

如果这个级别的定制不够用,ISyncBackoffStrategy可以在上面的.Options配置器中执行o.Register<ISyncBackoffStrategy>(c => new YourOwn SyncBackoffStrategy())来实现和使用。

1

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

你提到的5秒似乎很好地符合我之前所经历的最大等待时间,当我以调试模式(在这里你可以看到,它增加了时间跨度)运行Rebus。