NServiceBus Saga - 如何配置millisToSleepBetweenMessages?

时间:2011-07-07 15:25:11

标签: c# nservicebus

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

在saga的逻辑内部,如果没有达到条件,则会调用RequestTimeout方法1分钟。

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

有人知道如何更改此millisToSleepBetweenMessages属性吗?

提前致谢!西巴

1 个答案:

答案 0 :(得分:1)

我收集您当前使用的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>

在此版本的Timeout Manager中,您可以选择。您可以调整MillisToSleepBetweenMessages,只调整Timeout Manager处理的每条消息上的Thread.Sleep()超时。由于超时非常小,这会导致大量流失,因为消息会被重新放回队列并反复重新处理。

您可以将其调整为更高的1000毫秒,但请记住,您将失去大量的时间准确性,尤其是在有很多超时的情况下。如果您对通过此超时管理器的所有用例的要求是1分钟超时,则给予或接受,那就没关系。

否则,你有几个选择:

  • 查看未发布的NServiceBus 3.0代码,其中正在开发一个经过改进的TimeoutManager。
  • 查看我的博客文章NServiceBus TimeoutManager Revisited,其中我有一个我在生产场景中使用的超时管理器的实现。请记住,它不适用于多个站点或多个时区或任何类型的问题,但它确实解决了被迫放弃准确性以减少客户流失的问题。