it-swarm.com.de

Implementierung eines Leistungsschalter-Entwurfsmusters

Ich habe erfolglos versucht, das Leistungsschaltermuster hier in Java mithilfe des Spring-Frameworks zu implementieren. 

Wie können Sie ein Unterbrechungsmuster von Java und Spring implementieren?

9
user2585494

Für eine einfache, einfache Leistungsschalterimplementierung , check out Failsafe . Ex:

CircuitBreaker breaker = new CircuitBreaker()
  .withFailureThreshold(5)
  .withSuccessThreshold(3)
  .withDelay(1, TimeUnit.MINUTES);

Failsafe.with(breaker).run(() -> connect());

Wird nicht viel einfacher.

8
Jonathan

Apache Commons hat einige Implementierungen für verschiedene Arten von leichten Leistungsschaltern, hier ist ein Link zu den Dokumenten

Das Projekt enthält die Klassen EventCountCircuitBreaker und ThresholdCircuitBreaker sowie eine abstrakte AbstractCircuitBreaker, mit der Sie Ihre eigenen implementieren können.

Der Code besteht aus offenen Quellen und ist gehostet bei github . Daher sollte jeder, der versucht, das Muster zu implementieren, einen Blick darauf werfen.

5
svarog

Spring Cloud bietet einige interessante Integration mit Hystrix . Sie sollten wahrscheinlich einen Blick darauf werfen ...

3
Guillaume

In Bezug auf das Muster selbst

Viele nützliche Informationen zu diesem Muster erhalten Sie unter Martin Fowlers Blog . Es enthält eine Ruby-Implementierung sowie Referenzen für die Implementierung in anderen Sprachen.

Zur Java-Spring-Implementierung

Bitte überprüfen Sie die JRugged-Bibliothek . . Sie enthält die Implementierung von Circuit Breaker im Frühjahr sowie weitere Entwurfsmuster.

1

Sie müssen nicht Spring Cloud oder Spring Boot verwenden, um Hystrix verwenden zu können.
Die Verwendung von hystrix-javanica macht es einfach, Hystrix auch mit einfachem alten Spring zu verwenden.

Hier ein Beispiel für Fallback-Methoden (beide Methoden, getMessageTimeout und getMessageException, schlagen standardmäßig fehl):

@Configuration
@ComponentScan
@EnableAspectJAutoProxy
public class CircuitBreakingWithHystrix {

  @Bean
  public HystrixCommandAspect hystrixAspect() {
    return new HystrixCommandAspect();
  }

  public static void main(String[] args) throws Throwable {
    ApplicationContext ctx
      = new AnnotationConfigApplicationContext(CircuitBreakingWithHystrix.class);
    ExampleService ex = ctx.getBean(ExampleService.class);
    for (int i = 0; i < 1000; i++) {
      System.out.println(ex.getMessageException());
      System.out.println(ex.getMessageTimeout());
    }
  }

  @Service
  class ExampleService {

    /*
     * The default Hystrix timeout is 1 second. So the default 
     * version of this method will always fail.  
     * Adding the @HystrixProperty will cause 
     * the method to succeed.
     */
    @HystrixCommand(
      commandProperties = { 
      //@HystrixProperty(name = EXECUTION_ISOLATION_THREAD_TIMEOUT_IN_MILLISECONDS,
      //                 value = "5000")
      },
      fallbackMethod = "messageFallback"
    )
    public String getMessageTimeout() {
      try {
        //Pause for 4 seconds
        Thread.sleep(4000);
      } catch (InterruptedException ex) {
        // Do something clever with this
      }
      return "result";
    }

    @HystrixCommand(
      fallbackMethod = "messageFallback")
    public String getMessageException() {
      throw new RuntimeException("Bad things happened");
    }

    private String messageFallback(Throwable hre) {
      return "fallback";
    }

  }

Sie können auch das an die Fallback-Methode gesendete auslösbare Objekt untersuchen, um festzustellen, warum der Methodenaufruf fehlgeschlagen ist. 

1
Mark McLaren

Sie können einen Blick auf JCircuitBreaker werfen. Die Implementierung dort implementiert einen Ansatz, der auf einen Schutzschalter basiert. 

Bitte beachten Sie, dass dies keine 1: 1-Implementierung des Musters ist, da es keine festen Zustände wie "halb geöffnet" definiert. Stattdessen trifft es die Entscheidung (ob der Unterbrecher geöffnet oder geschlossen sein sollte), basierend auf dem aktuellen Anwendungsstatus (unter Verwendung einer sogenannten "Unterbrechungsstrategie"). Trotzdem sollte es möglich sein, eine solche "Break-Strategie" zu definieren, die die Ausfallschwellen auswertet. Daher sollte es möglich sein, auch das Originalmuster mit JCircuitBreaker zu implementieren.

0
walkeros