Оптимизация поиска саги

У меня есть процесс, который загружает файлы из удаленного расположения в параллельных потоках. Каждый поток отправляет сообщение, когда загрузка начинается, и второй, когда загрузка завершается. Оба сообщения имеют свойство 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();
}
Другие вопросы по тегам