优化传奇查找

Optimizing saga lookup

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

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

我遇到的问题是,当在短时间内(1 分钟内下载 1000 个文件)下载大量文件时,saga 的性能不是很好。有的时候要半个多小时才能赶上。

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

有没有其他方法可以加快 saga 的速度? 我正在考虑使用 DownloadId 作为 saga id,因为它已经是一个唯一的 guid。 saga 数据的Id 属性 是可以设置的,但是文档中明确指出你不应该自己设置id...

使用的传输:MSMQ 使用的持久化:RavenDB NServiceBus 版本:5

我修改了设置,因此不再需要 saga。 在下载文件的过程中,我现在启动一个计时器在后台发送通知,当下载完成时我停止计时器。这工作得更快,导致发送的消息少得多。

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();
}