1

Ich wollte ein Muster implementieren, die automatisch oder manuell alle Anforderungen an einen externen Dienst (d. H. Port) für einen Zeitraum zu stoppen, wenn Fehlerprozent einen Schwellenwert überschreitet. Ich habe zwei Serverinstanzen, die auf demselben Rechner mit unterschiedlichen Ports laufen (zB: 2401, 2402).Wie Load Balancer in Java implementieren

Jetzt ist die Anforderung, wenn Port 2401 Fehler Prozentschwelle übergibt, dann wollte ich alle Anfragen an diesen Port (2401) für einen bestimmten Zeitraum stoppen und zu einem anderen Port (2402) routen. Welcher Algorithmus dafür geeignet ist, bin ich nicht sicher.

Ich habe einige Artikel gelesen, aber keine Informationen über die Load Balancer-Implementierung in Java-Code.

Vielen Dank im Voraus, Sateesh

+0

Werfen Sie einen Blick auf Hystrix CircuitBreaker impl (die Hystrix-Befehle). Sie brauchen LB nicht dafür –

+0

Wenn wir jedoch einen Leistungsschalter auf eine Methode anwenden, überwacht Hystrix, ob Aufrufe dieser Methode fehlschlagen. Wenn Fehler bis zu einem Schwellenwert aufgebaut werden, öffnet Hystrix die Schaltung, sodass nachfolgende Aufrufe automatisch fehlschlagen. Ich bin mir bei diesem Training nicht sicher. –

+0

Sie können die Methode "getFallback" überschreiben, und von dort aus können Sie mit einem anderen Befehl die zweite Dienstinstanz aufrufen. –

Antwort

1

@Svetlin ist genau richtig, können Sie dies mit hystrix erreichen. Hier ist ein Beispielcode. Passen Sie es Ihren Anforderungen an.

@HystrixCommand(fallbackMethod = "fallBackForProductDetail", groupKey = "CircuitBreaker", commandKey = "frontend-productdetail", threadPoolKey = "frontend-productdetail", 
      commandProperties = { 
       @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000"),//Time before which this call is supposed to complete. if not throw exception. this is Optional 
       @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "5"), // Number of requests before which the cicuit is open 
       @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "1200000"),//20 minutes circuit will be open 
      }, 
      threadPoolProperties = { 
       @HystrixProperty(name = "coreSize", value = "30"), 
       @HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds", value = "180000")// 3 minutes rolling window. i.e the errors calculated for every 3 minute window. 
      }) 
    public String callProductDetail(.....){ 
     // call server1 
    } 

     // Return type and arguments should be exactly same as the method for wich this is fallback. (With an optional Throwable argument to catch exception) 
    public String fallBackForProductDetail(...){ 
     // call server2 
    } 

Jetzt, um das Verhalten zu erklären. Wenn die Anforderung an server1 fehlschlägt, wird der Zähler inkrementiert, und der Aufruf wird an die Fallback-Methode (FallBackForProductDetail) weitergeleitet und führt den Code innerhalb der Fallback-Methode aus. das gleiche Verhalten wird fortgesetzt, bis der Schwellenwert erreicht ist (in diesem Fall 5). Wenn der Schwellenwert erreicht ist, geht das Steuerelement nicht einmal in die Hauptmethode (callProductDetail), sondern direkt in die Fallback-Methode. Und das passiert für sleepWindowInMilliseconds (20 Minuten in diesem Fall).

Ich hoffe, es hilft.

+0

Vielen Dank @pvpkiran für die Hilfe. –

+0

froh, dass es geholfen hat. Wählen Sie, wenn es nützlich war. – pvpkiran

+0

jetzt besorgt, ich werde upvote): –