NServiceBus Saga -如何配置millisToSleepBetweenMessages
本文关键字:配置 millisToSleepBetweenMessages 何配置 Saga NServiceBus | 更新日期: 2023-09-27 18:01:33
我是c#的新手,我正在一个使用NServiceBus Saga的项目中工作。
在saga的逻辑中,如果没有达到某个条件,将调用RequestTimeout方法1分钟。
问题是这个调用消耗了太多的处理器,我认为这是因为TimeoutManager使用默认值10毫秒来检查时间是否到了,并将超时消息发送回saga。
有人知道这个millisToSleepBetweenMessages属性是如何被改变的吗?
提前感谢!西巴
我猜您当前使用的TimeoutManager是2.0或2.5版本。如果是这种情况,TimeoutManager端点本身有一个带有appSetting的配置文件(Timeout.MessageHandlers.dll.config)。
下面是一个例子:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="MsmqTransportConfig" type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core" />
</configSections>
<MsmqTransportConfig
InputQueue="timeoutmanager"
ErrorQueue="error"
NumberOfWorkerThreads="1"
MaxRetries="5"
/>
<appSettings>
<!-- relevant for a Serialization of "xml" only -->
<add key="NameSpace" value="http://www.UdiDahan.com"/>
<!-- can be either "xml", or "binary" -->
<add key="Serialization" value="xml"/>
<!-- default is 1000, influences memory use (16 bytes / saga ID) -->
<add key="MaxSagasIdsToStore" value="10000"/>
<!-- default is 10, decreasing this value gives better time resolution but higher IO churn -->
<add key="MillisToSleepBetweenMessages" value="10"/>
</appSettings>
</configuration>
在这个版本的超时管理器中,您有一个选择。您可以调整MillisToSleepBetweenMessages,这只是调整timeout Manager处理的每个消息的Thread.Sleep()超时。对于非常小的超时,这确实会导致大量的混乱,因为消息会被放回队列中并反复重新处理。
您可以将其调整为更高的值,如1000ms,但请记住,您将失去很多时间准确性,特别是如果有很多超时正在发生。如果您对通过这个超时管理器的所有用例的需求都是1分钟的超时,那么就可以了。
否则,您有几个选择:
- 看一下未发布的NServiceBus 3.0代码,其中一个改进的TimeoutManager正在开发中。
- 看看我的博客文章NServiceBus TimeoutManager Revisited,我有一个超时管理器的实现,我在我的生产场景中使用。请记住,它不是为多个站点或多个时区或任何这些类型的问题而设计的,但它确实解决了被迫放弃准确性以减少流失率的问题。