Оптимизация поиска саги
У меня есть процесс, который загружает файлы из удаленного расположения в параллельных потоках. Каждый поток отправляет сообщение, когда загрузка начинается, и второй, когда загрузка завершается. Оба сообщения имеют свойство id загрузки (guid), чтобы соотнести их.
Далее у меня есть сага, которая следит за этими загрузками. Он запускается событием DownloadStarted и использует тайм-аут, чтобы определить, было ли получено событие DownloadEnded во времени.
У меня проблема в том, что производительность саги не так велика, когда за короткое время загружается большое количество файлов (1000 файлов за 1 минуту). В определенное время для его наверстывания требуется более получаса.
Я попытался ускорить поиск саги, предоставив имплантацию IFindSagas. Это не очень помогло, так как это заставило RavenDB создать автоматический индекс для DownloadId в данных саги, но также заставило метод FindBy часто возвращать ноль, потому что этот индекс не обновлялся вовремя.
Есть ли другой способ ускорить сагу? Я думал об использовании DownloadId в качестве идентификатора саги, поскольку это уже уникальный гид. Свойство Id данных саги может быть установлено, но в документации конкретно указано, что вы не должны устанавливать идентификатор самостоятельно...
Используемый транспорт: MSMQ Постоянное использование: RavenDB Версия NServiceBus: 5
1 ответ
Я переделал настройку, чтобы сага больше не нужна. В процессе загрузки файла я теперь запускаю таймер для отправки уведомления в фоновом режиме, а когда загрузка завершается, я останавливаю таймер. Это работает намного быстрее и заставляет отправлять намного меньше сообщений.
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();
}