Réponse sous forme : Exigence -- Outil
Exécutions planifiées -- Quartz.NET
Quartz vous permet d'exécuter des "jobs" selon un planning donné. Il maintient également l'état entre les exécutions, donc si pour une raison quelconque le serveur s'arrête, lorsqu'il redémarre, il sait qu'il doit commencer à exécuter le job. Vraiment cool.
File d'attente distribuée -- NServiceBus
Un bon ServiceBus vaut son pesant d'or. Fondamentalement, ce que vous voulez faire, c'est vous assurer que tous vos workers ne font qu'une seule opération pour autant d'opérations qu'il y a dans la file d'attente. Si vous assurez que vos opérations sont idempotentes, NServiceBus est un excellent moyen d'y parvenir.
File d'attente -> Worker1 += Worker 2 += Worker 3 --> Stockage de données local -> File de données + Workers -> Stockage de données distant
Fondamentalement, afin de garantir que les valeurs de retour des opérations données sont suffisamment isolées du serveur SQL, vous voulez vous assurer de mettre en cache la valeur quelque part dans un système de stockage local. Cela pourrait être quelque chose de rapide et non relationnel comme RavenDB ou quelque chose de structuré comme SQLite. Ensuite, vous envoyez un identifiant dans une autre file d'attente via NServiceBus et vous le synchronisez avec le serveur SQL, les files d'attente sont vos amies ! :-)
Essentiellement, vous voulez vous assurer que aucune de vos opérations ne bloque et qu'elles sont suffisamment atomiques. Si vous ne connaissez pas encore TPL, vous devriez, c'est vraiment puissant ! J'entends beaucoup cela de la part des gens venant de Java, mais cela vaut la peine de le mentionner... C# devient vraiment un excellent langage pour les workflows asynchrones et parallèles !
Aussi, une chose cool qui sort du nouveau CTP asynchrone est TPL DataFlow. Je ne l'ai pas utilisé, mais cela semble vraiment correspondre à ce que vous recherchez !