Windows -Dienste in einer Webfarm (wie Sie Konflikte zur Verhinderung von Parallelität verhindern)

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

Frage

Blick auf die Zeit, wenn eine Webfarm erstellt wird ...

Wir haben verschiedene Windows-Service-Anwendungen, die verschiedene Aufgaben im Hintergrund ausführen: Senden von E-Mails, Miniaturanlagen/Verarbeitungsdateien usw.

In einer Serverfarm-Umgebung könnten wir theoretisch jeden Service auf jedem Computer installieren und ausführen. Es kann jedoch Konflikte aufgrund von auf Geschäftsobjekten basierenden "Erstwrite-Gewinnen" oder unerwünschter Duplikation von Aufgaben geben, z. B. dieselben E-Mails sind eine Nummer zu senden OF MENS.

Das Szenario "First-Write-Wins" kann durch Code oder Logik überwunden werden, das das Problem behebt oder den Artikel überspringt. (Wenn es sich um ein grundlegender Warteschlangenmechanismus (Abfrageliste und Prozessaufzeichnung) handelt, wird es einfach erneut ausprobiert.)

Für die Duplizierung von Aufgaben könnte man Aufgaben in Transaktionen ausführen, um zu verhindern, dass andere Prozesse dieselben Ressourcen erfassen. Ich denke, sie werden nur warten und wir müssten einige Anmeldungen basierend auf Dingen, die wieder geschehen, bewältigen? Wäre dies der Fall?

Um die Duplikation von Aufgaben zu verhindern, denke ich darüber nach, einen Mechanismus zu erstellen, der eine "Sperrenflag" in die Datenbank schreibt, die durch den ersten Dienst festgelegt wird, der auferlegt wird. Diese Flagge wird datiert und verweist auf die Instanz des Dienstes. Der Dienst, der das Flag "besitzt", wird die Aufgaben ausgeführt und dieses Datum regelmäßig aktualisieren. In der Situation, in der der Dienst das Flag nicht besitzt, wird auch eine Zeitüberschreitungs-/Toleranzeinstellung vorhanden, die die Toleranz überprüft und bei Bedarf die Kontrolle übernimmt.

Klingt dies nach einer anscheinlichen Lösung oder sollte man in dieser Phase zu einer besseren Lösung für eine bessere Meldung gehen (auch nicht sicher, wie dies in einer landwirtschaftlichen Umgebung funktionieren würde?

Tecnologies: C# / ASP.NET / SQL Server

War es hilfreich?

Lösung

Ich kann mir zwei Mechanismen vorstellen.

  1. Wenn alle Ihre Aufgaben aus Datenbankaktiviten abgeleitet werden, können Sie eine neue "Aufgaben" -Tabelle erstellen und Auslöser für die Aktivitäten festlegen, damit ein neuer Datensatz mit den Aufgabeninformationen eingefügt wird. Ihre Windows -Dienste können dann die Tabelle "Aufgaben" befragen und eine Atomauswahl- und Löschen -Transaktion verwenden, um sicherzustellen, dass nur ein Dienst dies tut.

  2. Sie können eine Meldungswarteschlange verwenden und Ihre Aufgaben darauf fallen lassen und dann Ihre Windows Services in die Warteschlange befragen. Jede Warteschlange kann nur von einem einzelnen Dienst gestaltet werden, sodass Sie sicherstellen können, dass jede Aufgabe nur einmal erledigt wird. Natürlich müssen Sie sich dann Sorgen um die Load in Ihrer Nachrichtenwarteschlange machen. Abhängig von Ihrer Bewerbung können Sie so etwas wie den einfachen Warteschlangenservice von Amazon verwenden, der Sie sich um Zuverlässigkeit und Skalierbarkeit sorgen müssen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top