Wie verwende ich einen Schutzschalter?
Ich bin auf der Suche nach Möglichkeiten, um remote-Anrufe auf services außerhalb meiner Kontrolle, bis eine Verbindung erfolgreich ist. Ich will auch nicht einfach einen timer einstellen, wo eine Aktion ausgeführt jeden n Sekunden/Minuten bis zum Erfolg. Nach ein paar Recherchen scheint es, dass die circuit breaker-Muster ist eine gute Passform.
Fand ich eine Umsetzung, verwendet einen Schloss Windsor Abfangjäger, die genial aussieht. Das problem ist nur, ich weiß nicht, wie es zu benutzen. Aus den wenigen Artikeln, die ich gefunden in Bezug auf das Thema die einzige Verwendung, die ich finden konnte, war, einfach den Schutzschalter rufen Sie eine Aktion nur einmal, das scheint nicht sehr nützlich. Aus, dass es scheint, ich brauche einfach meine Aktion mit dem Leistungsschalter in einem while(true)
Schleife.
Wie benutze ich den Windsor-interceptor zum ausführen einer Aktion einen Aufruf an einen externen Dienst, bis es erfolgreich ist ohne das zuschlagen von unseren Servern?
Könnte jemand bitte füllen Sie die fehlenden Teile?
Hier ist, was ich war in der Lage zu kommen mit
while(true)
{
try
{
service.Subscribe();
break;
}
catch (Exception e)
{
Console.WriteLine("Gotcha!");
Thread.Sleep(TimeSpan.FromSeconds(10));
}
}
Console.WriteLine("Success!");
public interface IService
{
void Subscribe();
}
public class Service : IService
{
private readonly Random _random = new Random();
public void Subscribe()
{
var a = _random.Next(0, 10) % 2421;
if(_random.Next(0, 10) % 2 != 0)
throw new AbandonedMutexException();
}
}
Basierend auf, dass ich denke, dass ich jetzt verstehen dieses Konzept und wie Sie es anwenden.
- Diese Implementierung verwendet einen timer, wo eine Aktion, die ausgeführt werden, alle n Sekunden/Minuten bis zum Erfolg.
- Das ist so eine komplexe Sache zu tun, es passt nicht wirklich in hier eine Antwort auf Stack Overflow. Aber FWIW, 9. Kapitel von meinem Buch erzählt, wie um zu verwenden, einen Leistungsschalter mit einfachen Dekorateure, wie auch Schloss Windsor, und andere Abschnitte enthalten entsprechende Implementierungen für die Einheit und Spring.NET. Es gibt auch den vollständigen code als download zur Verfügung. affiliate.manning.com/idevaffiliate.php?id=1150_236
- Es gibt auf jeden Fall einiges von zusätzlichen Kenntnisse erforderlich, um vollständig zu verstehen, was passiert ist und wie es zu implementieren, korrekt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist eine interessante Idee, wenn man viele threads zu schlagen, die gleichen Ressourcen. Die Funktionsweise ist, dass durch die Zusammenlegung die Anzahl der für die versuche aus den ganzen threads. Anstatt sich Gedanken über das schreiben einer Schleife zu versuchen und schlagen Sie die Datenbank 5 mal, bevor Sie tatsächlich Versagen, haben Sie den Leistungsschalter verfolgen alle versuche, Sie zu schlagen, die Ressource.
In einem Beispiel, Sie haben, sagen wir 5 threads laufen eine Schleife wie folgt aus (pseudo-code):
Vorausgesetzt, Ihr Fehlerbehandlung korrekt ist und alle diese Schleife laufen konnte 5 mal, und die ping-resource-insgesamt 50 mal.
Den Leistungsschalter versucht, reduzieren die Gesamtzahl der Zeiten, die Sie versucht zu erreichen, die Ressource. Jeder thread, oder der Anfrage versuchen, erhöht werden, einen einzigen Fehler-Zähler. Sobald die Fehlergrenze erreicht ist, wird der Leistungsschalter wird nicht versuchen, sich zu verbinden die Ressource für mehr fordert alle threads, bis der timeout abgelaufen ist. Es ist immer noch der gleiche Effekt von Abruf der Ressource bis es fertig ist, aber reduzieren Sie die Gesamtlast.
Mit diesem interceptor-Implementierung, die interceptor registriert wird, als ein singleton. So, alle Instanzen der Ressource-Klasse code, der Weiterleitung durch die Leistungsschalter-ersten für jeden Aufruf einer beliebigen Methode. Die interceptor ist nur ein proxy zu Ihrer Klasse. Es ist im Grunde überschreibt Ihre Methoden und ruft die interceptor-Methode zuerst, bevor Sie Ihre Methode.
Den Geöffnet/Geschlossen-bit kann verwirrend sein, wenn man keine Schaltung Theorie wissen.
wiki:
In der Theorie, der Stromkreis wird Geöffnet, wenn die Verbindung unterbrochen ist, und Geschlossen, wenn die Verbindung verfügbar ist. Der wichtige Teil von Ihrem Beispiel ist dies:
try
/catch
) in einer while-Schleife. Was passiert, wenn die Aktion erfolgreich aufgerufen? Ich habe das Gefühl, ich bin nur fehlt ein kleines Stück des Puzzles, um diese umzusetzen.OpenCircuitException
eher sagen, als eineSqlException
.Habe ich eine Bibliothek namens
CircuitBreaker.Net
Sie, dass kapselt die gesamte portion Logik sicher ausführen Aufrufe. Es ist einfach zu bedienen, ein Beispiel könnte so Aussehen:Es ist erhältlich über ein nuget-Paket. Finden Sie die Quellen auf github.