Verwenden von CurrentRoleInstance.Id, um eine Aufgabe in nur einer Instanz auszuführen

8

In einem Kontext, in dem Sie eine Webrolle über mehrere Instanzen verteilen und eine Aufgabe planen müssen, die nur von einer Instanz ausgeführt werden soll (z. B. das Senden einer E-Mail mit einigen Statistiken an den Site-Administrator), ist diese zuverlässig RoleEnvironment.CurrentRoleInstance.Id , damit die Aufgabe nur für eine Instanz ausgeführt wird (z. B. nur, wenn die ID mit IN_0 endet)? Wenn jemand das jemals getan hat, würde mich sein Feedback interessieren.

    
ThomasWeiss 15.03.2012, 07:29
quelle

3 Antworten

10

Ich würde keine Instanz-ID verwenden. Was passiert, wenn Instanz 0 neu gestartet wird (was mindestens einmal pro Monat geschieht)? Jetzt ist dein Scheduler oder Task-Runner offline.

Eine alternative Lösung ist die Verwendung eines Mutex-Typs, der Instanzen umfasst. Der, an den ich denke, ist ein Blob-Leasing. Sie können tatsächlich einen Blob zum Schreiben erwerben (und es kann nur einen Leasing-Inhaber geben). Sie könnten versuchen, eine Blob-Lease zu erhalten, bevor Sie eine Aufgabe ausführen. Wenn Sie es erhalten, führen Sie Aufgabe aus. Wenn nicht, führe es nicht aus.

Eine kleine Abweichung: Versuchen Sie in einem Thread (sagen wir von Ihrer Methode Run() ) eine Lease anzufordern und, falls erfolgreich, starten Sie eine Scheduler-Aufgabe (vielleicht einen Thread oder etwas). Wenn Sie den Mietvertrag nicht erwerben können, schlafen Sie eine Minute und versuchen Sie es erneut. Schließlich wird die Instanz mit dem Leasing neu gestartet (oder sie verschwindet aus einem anderen Grund). Nach einigen Sekunden wird eine andere Instanz die abgebrochene Lease übernehmen und eine neue Scheduler-Task starten.

Steve Marx hat einen Blog-Beitrag zum Thema Nebenläufigkeit unter Verwendung von Leasingverträgen geschrieben. Tyler Doerksen hat auch einen guten Beitrag über Mietverträge.

>     

David Makogon 15.03.2012, 10:43
quelle
5

Ja, Sie können die InstanceId bei Bedarf speziell verwenden

%Vor%

Es wird von folgender Form sein

%Vor%

Greifen Sie wie folgt auf die Umgebungsvariable in der Batch-Datei zu

%Vor%

Sie können dann die Teilzeichenfolge oder den letzten Index von _ verwenden, um den Index von InstanceId zu erhalten. wenn diese Instanz mit dem Index 0 auch nach einem Neustart den gleichen Index hat.

Weitere Details Ссылка

Ссылка

    
sudhAnsu63 02.05.2013 14:06
quelle
0

Es ist möglich, dass ein Ausführungscode-Block nur einmal ausgeführt wird, wenn Sie mehrere Instanzen haben, indem Sie beispielsweise die ID der aktuellen Rolleninstanz überprüfen, unter der Sie gerade arbeiten.

Sie können dasselbe Ergebnis mit anderen Lösungen erzielen, aber diese erfordern möglicherweise mehr Arbeit, wie z. B. die Entkopplung der Aufgabe von Ihrer Instanz.

    
Robbin Cremers 15.03.2012 08:18
quelle

Tags und Links