我有一个以并行线程从远程位置下载文件的进程。 每个线程在下载开始时发送消息,在下载完成时发送第二个消息。这两条消息都有一个下载id属性(guid)来关联这两个属性。
接下来我有一个监视这些下载的传奇。它由DownloadStarted事件启动,并使用超时来检测是否及时收到了DownloadEnded事件。
我遇到的问题是,如果在短时间内下载大量文件(1分钟内有1000个文件),那么传奇的性能就不那么好了。在某些时候它需要超过半小时才能赶上来。
我试图通过提供IFindSagas强制来加速传奇查找。这并没有多大帮助,因为这导致RavenDB在saga数据中的DownloadId上创建了一个自动索引,但也导致FindBy方法经常返回null,因为该索引没有及时更新。
还有其他办法可以加速传奇吗? 我正在考虑使用DownloadId作为传奇ID,因为这已经是一个独特的指导。 saga数据的Id属性是可设置的,但是文档明确指出你不应该自己设置id ...
使用的运输:MSMQ 使用的持久性:RavenDB NServiceBus版本:5
答案 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();
}