我正在对使用 2 个超时的传奇进行一些压力测试。在测试期间,大约创建了 21K saga。所以这意味着 42K 超时,但我注意到传奇的 timeoutsdispatcher 队列被成千上万的消息淹没,直到它崩溃,因为达到了 MSMQ 存储限制。
自从我将持久性机制从 RavenDB 切换到 SQL Server 后,我就看到了这种行为。
有谁知道可能出了什么问题?
传输:MSMQ
持久性:NHibernate 使用的包:
NHibernate version 4.0.4.4000
NServiceBus version 5.2.14
NServiceBus.Host version 6.0.0
NServiceBus.Log4Net version 1.0.0
NServiceBus.NHibernate version 6.2.7
测试设置:
* 端点 1 正在向端点 2 发送 22000 条消息。
* 端点 2 托管由该消息启动的 saga。
* 每个 saga 发布一个事件,然后请求 2 次超时:1 次在 4 分钟,1 次在 10 分钟。
观察到的行为:
* 端点 1 在一分钟内发送了 22K 条消息。
* 端点 2(传奇)每秒处理 5 到 10 条消息。
* 4 分钟后第一次超时被触发,而端点 2 仍在处理来自其队列的消息,因此仍在创建新的 saga 实例。
* 从那一刻起,saga 端点的 timeoutsdispatcher 队列被消息填满。
* 大约 10 分钟后,timeoutsdispatcher 队列已经包含超过 170K 的消息并且仍在填满。
* 这种情况一直持续到端点 2 崩溃,因为达到了 MSMQ 存储限制,或者输入队列中的所有消息都已处理。如果后者先发生,则 timeoutsdispatcher 队列消息计数开始减少,直到最终达到 0。