J'ai codé précisément ce genre de service Windows, et je pense que vous êtes sur la bonne voie.J'utilise une table de base de données pour ma file d'attente, ce qui me donne une file d'attente persistante en cas de plantage du système, permet à plusieurs rédacteurs de traverser le réseau local et me permet de gérer les conflits via les transactions.
Je crée des threads séparés pour chaque processus et je garde une trace du nombre de threads actifs, ce qui me permet d'ajuster à la volée. Étant donné que chaque thread effectue un appel de service Web, l'utilisation du pool de threads a présenté un avantage négligeable, ce qui m'a également permis de démarrer un grand nombre de threads car ils bloquaient l'attente sur un serveur externe.
Il est facile à gérer si vous n'autorisez qu'un seul lecteur, ce qui vous permet de suivre les entrées de file d'attente que vous avez lues en utilisant simplement une colonne d'identité et en sélectionnant la suivante plus haute que la dernière. Lorsqu'un thread termine, il peut supprimer l'entrée sur laquelle il travaillait. Si votre service tombe en panne, il récupérera simplement la première entrée non lue. Vous pouvez obtenir colombophile en incluant une colonne qui indique quand l'entrée a été touchée, et si le traitement échoue (peut-être en raison d'un délai d'attente réseau) alors vous pouvez le déconnecter et le laisser attraper par la lecture suivante. Si vous avez besoin de plusieurs lecteurs, utilisez un champ d'horodatage qui indique quand il a été touché; un lecteur peut récupérer pour un autre lecteur écrasé en vérifiant quand une entrée a été touchée. Vous devez également intercepter l'événement de fermeture de service afin que vous puissiez terminer le traitement proprement, et inclure votre propre journalisation afin que vous puissiez suivre ce qui se passe une fois que vous avez plusieurs écrivains simultanés. Considérez également une version de test qui vous permet de marteler votre lecteur de file d'attente et de mesurer comment il supporte sous charge. Cela ira un long chemin pour vous aider à éliminer les pièges pas si évidents qui se cachent dans une application multi-thread.
Mais j'ai eu une explosion en créant ceci et j'espère que vous aussi.
Si vous utilisez une file d'attente de messages plutôt qu'une table de base de données, considérez-vous qu'un message de file d'attente est une 'nouvelle entrée' ou est-ce une valeur spécifique que le message pourrait contenir? –
Un message de file d'attente serait une nouvelle entrée. La nouvelle entrée sera également supprimée de la file d'attente si elle est traitée avec succès. – Emon