So erlauben Sie die Ausführung nur einer Version des Hintergrundjobs [geschlossen]C#

Ein Treffpunkt für C#-Programmierer
Anonymous
 So erlauben Sie die Ausführung nur einer Version des Hintergrundjobs [geschlossen]

Post by Anonymous »

Ich habe die Aufgabe, einen Sicherheitsmechanismus zu implementieren, der sicherstellt, dass jeweils nur eine Version eines Hintergrunddienstes ausgeführt werden kann. Ich kann die vorhandene Architektur nicht ändern oder neue Infrastrukturkomponenten einführen, daher bin ich auf das beschränkt, was wir bereits haben: Azure SQL Server, Azure Blob und Service Bus.
Das Problem tritt auf, wenn während der Bereitstellung zwei Versionen der Anwendung (alt und neu) gleichzeitig ausgeführt werden. Dies ist eine häufige Situation, wenn Azure App Service-Slot-Swaps für Bereitstellungen ohne Ausfallzeiten verwendet werden.
Eine der einfachsten vorgeschlagenen Lösungen (von Stack Overflow) besteht darin, die neue Version nach dem Austausch manuell zu entsperren. Leider hat dies schwerwiegende Nachteile: Bei manuellen Neustarts oder Neustarts, die nicht durch die Bereitstellung ausgelöst werden, wird die Anwendung nicht automatisch entsperrt. Dies kann zu Ausfallzeiten für Hintergrunddienste führen, und da unsere Anwendung stark von diesen Diensten abhängt, können wir uns nicht mehr als eine Minute Ausfallzeit leisten.
Ein weiterer Vorschlag war die Verwendung einer verteilten Sperre, die über Azure SQL Server implementiert wird. Der erste Ansatz war die Verwendung von sp_getapplock, aber das hängt von der zugrunde liegenden DB-Verbindung ab. Wenn die Verbindung aufgrund von Netzwerkproblemen unterbrochen wird, wird die Sperre möglicherweise nicht ordnungsgemäß aufgehoben, was möglicherweise zu stundenlangen Ausfallzeiten führt.
Der zweite Ansatz bestand darin, eine benutzerdefinierte Tabelle mit TTL zu verwenden. Dies könnte jedoch zu einer Situation führen, in der zwei Versionen des Hintergrunddienstes glauben, dass sie beide die Sperre halten, obwohl nur eine dies tatsächlich tut.
Wir haben auch darüber nachgedacht, Hintergrunddienste im Produktionsslot zu blockieren und sie beim Start der Anwendung standardmäßig zu entsperren. Wenn der Staging-Slot jedoch aus irgendeinem Grund nicht startet, kann es zu einer Ausfallzeit von mehr als einer Minute kommen. Hängt zu sehr von der Zeitspanne zwischen dem Sperren und dem Starten der zweiten Version der App ab.
Meine Frage lautet also: Hat jemand diese Art von Problem bereits gelöst, oder hat jemand Vorschläge, wie man es zuverlässiger lösen kann?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post