我们使用 Rebus 和 MSMQ 在应用程序组件之间进行基于消息的通信。这些组件都在同一台机器上运行。
发送和接收消息之间的时间通常保持在一秒以下。但是,如果系统空闲一分钟左右(意味着没有发送任何消息),则接下来的一两条消息有时需要大约五秒钟的时间才能传送。MSMQ 性能计数器显示这些消息在此期间保留在队列中。
对于我们的应用程序来说,希望消息具有恒定的传递时间(低于一秒)。
这种行为的原因可能是什么?有没有办法影响 MSMQ 或 Rebus 中消息的传递时间?我们是否应该选择其他运输类型以获得更稳定的交货时间?
默认情况下,Rebus 将根据BackoffBehavior中的时间跨度逐渐取消对队列的轮询- 正如您所看到的,如果队列保持空闲时间足够长,它将最终每 5 秒轮询一次。
您可以通过以下方式更改为低延迟退避策略:
Configure.With(...)
.(...)
.Behavior(b => b. SetLowLatencyBackoffBehavior())
.(...)
Run Code Online (Sandbox Code Playgroud)
在配置咒语中。
更新:在 Rebus 的更高版本(即版本 >= 2)中,可以像这样自定义退避时间:
Configure.With(...)
.(...)
.Options(o => {
o.SetBackoffTimes(
TimeSpan.FromMilliseconds(100),
TimeSpan.FromMilliseconds(200),
TimeSpan.FromSeconds(1)
);
})
Run Code Online (Sandbox Code Playgroud)
在这种情况下,在空闲运行的前两秒内以 100 毫秒和 200 毫秒的间隔进行轮询,然后在其余时间以 1 秒的间隔进行轮询。
如果这个级别的定制还不够,可以通过上面的配置器ISyncBackoffStrategy来实现和使用。o.Register<ISyncBackoffStrategy>(c => new YourOwn SyncBackoffStrategy()).Options
| 归档时间: |
|
| 查看次数: |
274 次 |
| 最近记录: |