0

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

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

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

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

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

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

4

1 回答 1

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();
}
于 2016-04-25T16:36:31.640 回答