[Thème du printemps] série en direct revoir le Guide de fonctionnalité du cadre de retry d'exception Spring retry

Haoyu tianshang 2021-11-20 14:38:15 阅读数:628

th du printemps rie en

C'est ma participation11Le défi du mois de juin19Oh, mon Dieu.,Voir les détails de l'événement:2021Un dernier défi

Contexte opérationnel du mécanisme de retry

Les services externes ne sont généralement pas fiables pour les appelants,En particulier dans un environnement de réseau pauvre,Le Jitter du réseau peut facilement entraîner des exceptions telles que le délai de demande.,À ce stade, vous devez rappeler avec la politique de retry échouée API Interface pour obtenir.

Dans un système distribué,Afin d'assurer une forte cohérence dans les transactions distribuées de données,Tout le monde appelleRPCInterface ou envoiMQHeure,Retry Action for possible Network dithering request timeout. La façon la plus courante de réessayer estMQC'est,Mais si votre projet n'a pas été introduitMQ,Ce n'est pas pratique.

Introduction et limites de la politique de retry

La politique de retry est également largement utilisée dans la gouvernance des services.,Grâce à des tests programmés,Pour voir si le Service a survécu.

Retry est limité par le scénario,Toutes les scènes ne conviennent pas pour réessayer,Par exemple, la vérification des paramètres est illégale、Opérations d'écriture, etc(Pour déterminer si l'écriture est idémponente)Ne convient même pas à un nouvel essai.

  • Délai d'appel à distance、Une interruption soudaine du réseau peut être récupérée.Dans le cadre de la gouvernance des micro - services,En général, il y a sa propre configuration de retry et de timeout,Par exemple,dubboPeut être régléretries=1,timeout=500Échec de l'appel seulement retry1Une fois,Plus que500msL'appel a échoué si l'appel n'est pas retourné.

Quels sont les scénarios pour retry?

Extérieur RPC Appelez,Ou l'entreposage des données, etc.,Si une opération échoue,Vous pouvez réessayer plusieurs fois,Augmenter les chances de succès de l'appel.

Cadre de retry commun

  • SpringException retry FrameSpring Retry:Spring RetryPrise en charge de l'intégration dansSpringOuSpring BootDans le projet,Et il soutientAOPInjection tangentielle de,Il faut donc introduireaspectjweaver.jarSac.

  • sisyphus Intégré spring-retry Et gauva-retrying Avantages,Il est également très flexible à utiliser.

  • github.com/houbb/sisyp…

  • guava-retrying Le module offre une approche générale, Peut être utiliséGuavaUn arrêt spécifique pour l'amélioration de la correspondance prédicative、Retry and exception handling features to retry anyJavaCode.

spring-retryMécanisme de retry pour

Spring Retry Pour Spring L'application fournit un support déclaratif pour retry. Il est utilisé pourSpringTraitement par lots、SpringIntégration、Apache Hadoop(Attendez un peu!)DeSpring.

This is a small extension to Google’s Guava library to allow for the creation of configurable retrying strategies for an arbitrary function call, such as something that talks to a remote service with flaky uptime.

MavenConfiguration

Activer la fonction retry

Ajouter au - dessus de la classe de dé[email protected],Activer la fonction retry,Ou en utilisantretryDeserviceAjouter ci - dessus peut également,OuConfigurationAu - dessus de la classe de configuration.Tous lesEnableConfiguration ajoutée à la classe de démarrage,Gérer clairement et uniformément les fonctions utilisées.

[email protected]@RecoverNotes

@RetryableNotes,La méthode annotée est récupérée en cas d'exception
  • value:Spécifiez l'exception qui s'est produite pour retry
  • include:EtvalueC'est pareil,Vide par défaut,QuandexcludeAussi vide,Retry toutes les exceptions
  • exclude:Spécifiez que l'exception ne sera pas récupérée,Vide par défaut,QuandincludeAussi vide,Retry toutes les exceptions
  • maxAttemps:Nombre de retraits,Par défaut3
  • backoff:Retry the Compensation Mechanism,Par défaut, il n'y a pas
@BackoffNotes
  • delay:Retry après avoir spécifié un délai

  • multiplier:Spécifiez un multiple du délai,Par exemple,delay=5000l,multiplier=2Heure,Pour la première fois, essayez5Dans quelques secondes.,Deuxièmement Deuxième10Secondes,La troisième fois20Secondes

@RecoverNotes

Lorsque retry atteint le nombre spécifié de fois,La méthode annotée sera rappelée,Le traitement des journaux peut être effectué dans cette méthode.Il est à noter que le rappel n'est effectué que lorsque l'exception se produit et que le type de paramètre entrant est le même..

guava-retry

guava-retrying Le module offre une approche générale, Peut être utiliséGuavaUn arrêt spécifique pour l'amélioration de la correspondance prédicative、Retry and exception handling features to retry anyJavaCode.

guava-retryDeGitAdresse

github.com/rholder/gua…

Avantages

guava retryerOutils etspring-retrySimilaire,Est d'envelopper un retry logique normal en définissant le rôle du retry,MaisGuava retryerUne meilleure définition de la politique,Sur la base de la prise en charge du nombre de retraits et du contrôle de la fréquence des retraits,Être compatible avec les définitions de source retry qui supportent plusieurs exceptions ou objets d'entité personnalisés,Donner plus de flexibilité à la fonction retry.

Guava RetryerEst également Thread - SAFE,La logique d'appel d'entrée est java.util.concurrent.Callable De call() Méthodes,Après avoir rencontré une exception,Retry 3 Arrêt secondaire

public static void main(String[] args) {
Callable<Boolean> callable = new Callable<Boolean>() {
@Override
public Boolean call() throws Exception {
// do something useful here
LOGGER.info("call...");
throw new RuntimeException();
}
};
Retryer<Boolean> retryer = RetryerBuilder.<Boolean>newBuilder()
.retryIfResult(Predicates.isNull())
.retryIfExceptionOfType(IOException.class)
.retryIfRuntimeException()
.withStopStrategy(StopStrategies.stopAfterAttempt(3))
.build();
try {
retryer.call(callable);
} catch (RetryException | ExecutionException e) {
e.printStackTrace();
}
}
Copier le Code

Introduction aux principales interfaces et stratégies

  • Attempt:Une mission à la fois;
  • AttemptTimeLimiter:Délai d'exécution d'une seule tâche(Si une seule tâche a expiré,Mettre fin à l'exécution de la tâche courante);
  • BlockStrategies:Stratégie de blocage des tâches(En général, la tâche actuelle est terminée.,La prochaine mission n'a pas encore commencé.……- - BlockStrategies.THREAD_SLEEP_STRATEGY C'est - à - dire l'appel Thread.sleep(sleepTime);
  • RetryException:Retry exception;
  • RetryListener:Personnaliser l'auditeur retry,Peut être utilisé pour enregistrer les erreurs asynchrones;
  • StopStrategy:Arrêter de retry la politique,Disponible en 3 catégories:
  • StopAfterDelayStrategy:Fixer un délai d'exécution maximal autorisé;Comme le réglage de l'exécution maximale10s,Peu importe le nombre de fois où la tâche a été exécutée,Il faut plus de temps pour réessayer.,La tâche est terminée.,Et renvoie l'exception retryRetryException;
  • NeverStopStrategy:Non, arrête.,Pour les situations nécessitant une rotation continue jusqu'à ce que les résultats souhaités soient retournés;
  • StopAfterAttemptStrategy:Définir le nombre maximum de retraits,Arrêter le retry si le nombre maximum de retry est dépassé,Et renvoie l'exception retry;
  • WaitStrategy:Politique sur la durée d'attente(Intervalle de contrôle),Renvoie la durée de la prochaine exécution:
  • FixedWaitStrategy:Politique de durée d'attente fixe;
  • RandomWaitStrategy:Stratégie de durée d'attente aléatoire(Peut fournir une durée minimale et maximale,La durée d'attente est sa valeur aléatoire d'intervalle)
  • IncrementingWaitStrategy:Augmenter la politique de durée d'attente(Fournir une valeur initiale et une étape,Le temps d'attente augmente avec le nombre de retraits)
  • ExponentialWaitStrategy:Stratégie exponentielle de durée d'attente;
  • FibonacciWaitStrategy :Fibonacci Politique sur la durée d'attente;
  • ExceptionWaitStrategy :Politique d'attente de durée anormale;
  • CompositeWaitStrategy :Politique d'attente Composite;

Décider s'il faut réessayer en fonction des résultats

Utiliser le scénario:Si la valeur de retour détermine si vous voulez réessayer.

Retry interface

Retry Policy settings Infinite retry

Utiliser le scénario:En cas d'anomalie,Retry infini(Politique d'exécution par défaut),Jusqu'à ce que les résultats valides normaux soient retournés;

Déterminer si l'essai doit être répété en fonction de l'exception

Utiliser le scénario:Retry est effectué en fonction du type d'exception lancée.

Politique d'attente——Définir la politique d'attente fixe pour retry

Utiliser le scénario:Définir l'intervalle d'attente pour chaque retry fixé à10s;

Politique d'attente——Définir une stratégie de croissance fixe pour la durée d'attente de retry

Scénario:Définir la durée d'attente initiale,Et Réglez l'étape de croissance fixe,Mais ne fixe pas la durée maximale d'attente;

Par exemple:Intervalle d'appel incrémental1Secondes:

Retry the summary of the Framework

Retry élégant des similitudes et des principes

  • Découplage normal et retry élégant,Retry assertion l'Instance conditionnelle ou l'instance d'exception logique est le moyen de communication entre les deux,Il y a un autre moyen.,C'est le développeur qui écrit le mécanisme de retry lui - même,Mais surtout pas assez élégant

  • Intervalle de retry convenu,Stratégie de retry différentiel,Définir le délai de retry,Assurer davantage l'efficacité du retry et la stabilité du processus de retry.

  • Les deux ont utilisé le mode de conception de commande,Effectuer l'opération logique correspondante en déléguant l'objet retry,En même temps, l'encapsulation interne implémente la logique de retry.

  • spring-retry Et guava-retry Les outils sont des retry sans fil,L'exactitude logique de retry qui peut supporter des scénarios d'affaires simultanés.Les deux sont des stratégies de retry plus élégantes,Spring-retryConfiguration plus simple,Les fonctions mises en œuvre sont également relativement simples,GuavaC'est la boutique de Google.javaBibliothèque de classe,guava-retryC'est aussi très puissant,Comparé àSpring-RetryPlus de sélectivité dans les conditions de jugement pour réessayer ou non,Peut être utilisé commeSpring-retryPour compléter.

Retry élégant adapté au scénario

Un scénario de dépendance instable existe dans la logique fonctionnelle,Un retry est nécessaire pour obtenir les résultats attendus ou une logique de retry n'est pas terminée immédiatement.Comme l'accès à l'interface distante,Accès au chargement des données,Vérification du téléchargement des données, etc.

Vous devez réessayer le scénario pour la présence d'un scénario d'exception,En attendant, je veux découpler la logique normale de la logique de retry.

Pour les interactions sur support de données requises,Vous souhaitez également envisager un scénario logique d'exécution par retry Poll Detection.

Copyright:Cet article est[Haoyu tianshang]Établi,Veuillez apporter le lien original pour réimprimer,remercier。 https://fra.fheadline.com/2021/11/20211120143813894t.html