2016-04-22 1 views
0

J'ai un processus qui télécharge des fichiers depuis un emplacement distant dans des threads parallèles. Chaque thread envoie un message lors du démarrage d'un téléchargement et un second lorsque le téléchargement est terminé. Les deux messages ont une propriété id de téléchargement (guid) pour corréler les deux.Optimisation de la recherche de saga

Ensuite, j'ai une saga qui surveille ces téléchargements. Il est démarré par l'événement DownloadStarted et utilise un délai d'expiration pour détecter si l'événement DownloadEnded est reçu à temps. Le problème que j'ai, c'est que la performance de la saga n'est pas géniale quand une grande quantité de fichiers est téléchargée en peu de temps (1000 fichiers en 1 minute). À certains moments, il faut plus d'une demi-heure pour le rattraper.

J'ai essayé d'accélérer la recherche de saga en fournissant une implémentation IFindSagas. Cela n'a pas aidé beaucoup, car cela a provoqué RavenDB à créer un index automatique sur le DownloadId dans les données saga, mais a également causé la méthode FindBy souvent retourner null parce que cet index n'a pas été mis à jour à temps.

Y a-t-il un autre moyen d'accélérer la saga? Je pensais utiliser le DownloadId comme id de saga, car c'est déjà un guide unique. La propriété Id des données de la saga peut être réglé, mais la documentation précise que vous ne devez pas définir l'id vous ...

Transport utilisé: MSMQ persistance utilisé: RavenDB Version NServiceBus: 5

Répondre

0

que nous avons retravaillé la configuration pour que la saga ne soit plus nécessaire. Dans le processus qui télécharge le fichier, je lance maintenant une minuterie pour envoyer une notification en arrière-plan et lorsque le téléchargement est terminé, j'arrête le minuteur. Cela fonctionne beaucoup plus rapidement et cause beaucoup moins de messages à envoyer.

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