2016-04-22 2 views
0

У меня есть процесс, который загружает файлы из удаленного места в параллельных потоках. Каждый поток отправляет сообщение при запуске загрузки, а второй - при завершении загрузки. Оба сообщения имеют свойство id загрузки (guid) для корреляции этих двух.Оптимизация поиска саги

Далее У меня есть сага, которая отслеживает эти загрузки. Он запускается с помощью события DownloadStarted и использует таймаут, чтобы определить, получено ли событие DownloadEnded вовремя.

Проблема, которую я испытываю, заключается в том, что производительность саги не так уж велика, когда большое количество файлов загружается за короткое время (1000 файлов за 1 минуту). В определенные моменты для этого требуется больше получаса.

Я попытался ускорить поиск саги, предоставив имплантацию IFindSagas. Это не помогло, поскольку это заставило RavenDB создать автоматический индекс в DownloadId в данных саги, но также заставил метод FindBy часто возвращать значение null, потому что этот индекс не обновлялся вовремя.

Есть ли другой способ, которым я мог бы попытаться ускорить сагу? Я думал об использовании DownloadId как saga id, так как это уже уникальный guid. Свойство Id данных саг является настраиваемой, но в документации конкретно говорится, что вы не должны установить идентификатор себя ...

Транспорт используется: MSMQ Постоянство используется: RavenDB NServiceBus версия: 5

ответ

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