Services Windows dans une batterie de serveurs Web (comment prévenir les conflits de simultanéité)

StackOverflow https://stackoverflow.com/questions/1420578

Question

À l'avenir, quand une ferme Web sera créée ...

Nous avons diverses applications de service Windows effectuant diverses tâches d'arrière-plan: envoi d'e-mails, vignettes / traitement de fichiers, etc.

Dans un environnement de batterie de serveurs, nous pourrions en théorie installer et exécuter chaque service sur chaque ordinateur. Toutefois, des conflits peuvent survenir du fait de l'objet "first-write-win" basé sur les objets métier. ou duplication indésirable de tâches, par exemple: les mêmes courriels sont envoyés plusieurs fois.

Le " first-write-wins " scénario peut être surmonté par le code ou la logique qui résout le problème ou ignore l'élément. (s’il s’agit d’un mécanisme de base de mise en file d’attente (liste de requêtes et enregistrement de processus), il sera simplement réessayé)

Pour la duplication de tâches, vous pouvez effectuer des tâches dans des transactions pour empêcher d’autres processus de récupérer les mêmes ressources, mais je suppose qu’ils vont simplement attendre et que nous aurions besoin de gérer certains identifiants de connexion en fonction de la situation. Serait-ce le cas?

Pour éviter la duplication des tâches, je pense peut-être à créer un mécanisme permettant d'écrire un "indicateur de verrouillage". à la base de données qui sera définie par le premier service qui se déclenche. Ce drapeau sera daté et référencera l'instance du service. Le service que " possède " le drapeau exécutera les tâches et mettra à jour périodiquement cette date. Un délai / une tolérance sera également défini pour chaque service dans la situation où le service ne possède pas le drapeau, il vérifiera la tolérance et prendra la relève si nécessaire.

Cela vous semble-t-il une solution raisonnable ou faut-il passer à une meilleure solution basée sur la mise en file d'attente des messages à ce stade (vous ne savez pas non plus comment cela fonctionnerait dans un environnement de batterie de serveurs?

Technologies: C # / ASP.NET / SQL Server

Était-ce utile?

La solution

Je peux penser à deux mécanismes.

  1. Si toutes vos tâches sont dérivées d'activités de base de données, vous pouvez créer un nouveau " tâches " table et définissez les déclencheurs sur les activités afin qu'un nouvel enregistrement avec les informations de tâche soit inséré. Vos services Windows peuvent alors interroger les " tâches " table et utilisez une transaction de sélection et de suppression atomique pour vous assurer que seul un service le fait.

  2. Vous pouvez utiliser une file d'attente de messages, y déposer vos tâches, puis demander à vos services Windows d'interroger la file d'attente. Chaque message en file d'attente ne pourra être mis en file d'attente que par un seul service, vous permettant ainsi de vous assurer que chaque tâche n'est effectuée qu'une seule fois. Bien sûr, vous devez alors vous soucier de la charge de votre file de messages. En fonction de votre application, vous pouvez utiliser le service Simple Queue d'Amazon, ce qui vous évitera de vous soucier de la fiabilité et de l'évolutivité.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top