NServiceBus Saga -如何配置millisToSleepBetweenMessages

本文关键字:配置 millisToSleepBetweenMessages 何配置 Saga NServiceBus | 更新日期: 2023-09-27 18:01:33

我是c#的新手,我正在一个使用NServiceBus Saga的项目中工作。

在saga的逻辑中,如果没有达到某个条件,将调用RequestTimeout方法1分钟。

问题是这个调用消耗了太多的处理器,我认为这是因为TimeoutManager使用默认值10毫秒来检查时间是否到了,并将超时消息发送回saga。

有人知道这个millisToSleepBetweenMessages属性是如何被改变的吗?

提前感谢!西巴

NServiceBus 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,我有一个超时管理器的实现,我在我的生产场景中使用。请记住,它不是为多个站点或多个时区或任何这些类型的问题而设计的,但它确实解决了被迫放弃准确性以减少流失率的问题。