web-dev-qa-db-fra.com

Mise en œuvre du modèle de conception de disjoncteur

J'ai essayé sans succès d'implémenter le modèle de disjoncteur, ici , en Java en utilisant le framework Spring. 

Comment pouvez-vous implémenter le modèle de disjoncteur par Java et Spring?

9
user2585494

Pour un implémentation de disjoncteur simple et direct, consultez Failsafe . Ex:

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

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

Ça ne devient pas beaucoup plus simple.

8
Jonathan

Apache commons a quelques implémentations pour plusieurs types de disjoncteurs légers, voici un lien vers la documentation

Le projet fournit les classes EventCountCircuitBreaker et ThresholdCircuitBreaker, ainsi qu'un résumé AbstractCircuitBreaker afin que vous puissiez implémenter les vôtres.

Le code est open source et est hébergé sur github , ainsi toute personne essayant d'implémenter le modèle devrait au moins jeter un coup d'oeil.

5
svarog

Spring Cloud fournit une intégration intéressante avec Hystrix . Vous devriez probablement y jeter un coup d'œil ...

3
Guillaume

En ce qui concerne le motif lui-même

Vous pouvez obtenir de nombreuses informations utiles sur ce modèle sur Le blog de Martin Fowler . Il contient l'implémentation de Ruby ainsi que des références pour l'implémentation dans d'autres langues.

Concernant l'implémentation de Java

Veuillez vérifier la bibliothèque JRugged . Elle contient la mise en œuvre du disjoncteur au printemps ainsi que d’autres modèles de conception.

1
Dawid Bugajewski

Vous n'avez pas besoin d'utiliser Spring cloud ou Spring Boot pour utiliser Hystrix.
Utiliser hystrix-javanica facilite également l’utilisation de Hystrix avec Spring.

Voici un exemple de méthode de secours (les deux méthodes, getMessageTimeout et getMessageException, échouent par défaut):

@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";
    }

  }

Vous pouvez également examiner le jetable envoyé à la méthode de secours pour identifier la raison de l'échec de l'appel de la méthode. 

1
Mark McLaren

Vous pouvez consulter JCircuitBreaker . La mise en œuvre met en œuvre une approche semblable à celle d'un disjoncteur 

Veuillez noter qu'il ne s'agit pas d'une implémentation 1: 1 du modèle car il ne définit pas d'états fixes comme "semi-ouvert". Au lieu de cela, il prend la décision (si le disjoncteur doit être ouvert ou fermé) en se basant sur l'état actuel de l'application (en utilisant la "stratégie de rupture"). Néanmoins, il devrait être possible de définir une telle "stratégie de rupture" qui évalue les seuils de défaillance - de sorte qu'il soit également possible de mettre en œuvre un modèle original à l'aide de JCircuitBreaker.

0
walkeros