优化传奇查找

时间:2016-04-22 10:23:53

标签: nservicebus nservicebus-sagas

我有一个以并行线程从远程位置下载文件的进程。 每个线程在下载开始时发送消息,在下载完成时发送第二个消息。这两条消息都有一个下载id属性(guid)来关联这两个属性。

接下来我有一个监视这些下载的传奇。它由DownloadStarted事件启动,并使用超时来检测是否及时收到了DownloadEnded事件。

我遇到的问题是,如果在短时间内下载大量文件(1分钟内有1000个文件),那么传奇的性能就不那么好了。在某些时候它需要超过半小时才能赶上来。

我试图通过提供IFindSagas强制来加速传奇查找。这并没有多大帮助,因为这导致RavenDB在saga数据中的DownloadId上创建了一个自动索引,但也导致FindBy方法经常返回null,因为该索引没有及时更新。

还有其他办法可以加速传奇吗? 我正在考虑使用DownloadId作为传奇ID,因为这已经是一个独特的指导。 saga数据的Id属性是可设置的,但是文档明确指出你不应该自己设置id ...

使用的运输:MSMQ 使用的持久性:RavenDB NServiceBus版本:5

1 个答案:

答案 0 :(得分:0)

我重新设置了设置,以便不再需要传奇。 在下载文件的过程中,我现在启动计时器以在后台发送通知,并在下载完成时停止计时器。这样可以更快地发挥作用,并且可以发送更少的消息。

using (var timer = new Timer(1000) {AutoReset = true})
{
    var start = DateTime.Now;
    timer.Elapsed += (sender, e) =>
                      _bus.Send(new NotifyHangingDownload(correlationId,
                                                          file.Filename,
                                                          start,
                                                          TimeSpan.FromMilliseconds(1000)));
    timer.Start();
    client.Download(file, destination, false);
    timer.Stop();
}