[JAVA] Modèle de disjoncteur avec Apache Camel

Modèle de disjoncteur

Le modèle de disjoncteur est l'un des modèles de conception. Lorsqu'une application accède à un service distant, une défaillance temporaire peut se produire en raison d'une charge élevée ou d'un basculement de base de données. Il s'agit d'un échec temporaire et si vous attendez qu'il récupère, le processus réussira sans aucune erreur. Le modèle de disjoncteur est utilisé dans de tels cas, et si une panne est détectée, il ne sera pas accessible jusqu'à ce qu'il soit récupéré. Cela présente les avantages de ne pas provoquer un grand nombre d'erreurs, de ne pas poursuivre le traitement car on sait qu'une erreur se produira et de ne pas imposer une charge inutile du côté distant. C'est ce qu'on appelle le modèle de disjoncteur car il laisse tomber le disjoncteur lorsque la charge est élevée.

Le disjoncteur a les trois états suivants.

image.png

Le modèle de disjoncteur a été publié (?) En 2007 dans le livre Release It! (Bien que je n'y jette qu'un coup d'œil). La version japonaise de Relase It! A également été publiée, et la deuxième édition suivante a également été publiée en 2018 (pas de version japonaise).

Le modèle de disjoncteur peut également être trouvé sur le blog de Martin Fowler.

Il y a aussi la partie 2 de cet article. Modèle de disjoncteur avec Apache Camel, partie 2 (Essayez Hystrix Dashboard)

Utilisez le modèle de disjoncteur dans Apache Camel

Avec Apache Camel, vous pouvez profiter des deux disjoncteurs suivants:

L'équilibreur de charge de disjoncteur est une implémentation simple qui réalise un modèle de disjoncteur. Il a moins de fonctionnalités que le Hystrix EIP, mais est facile à utiliser. Cependant, comme il est obsolète dans la v2.23.0, vous devrez utiliser l'EIP Hystrix suivant. Hystrix EIP est un composant permettant d'utiliser Camel avec une bibliothèque de tolérance aux pannes appelée Hystrix développée par NetFlix. Hystrix a également de nombreuses fonctions en tant que disjoncteur.

Pour Hystrix EIP, je vais créer un exemple de programme et l'exécuter plus tard.

Les sites Web officiels de Circuit Breaker Load Balancer et Hystrix EIP sont les suivants.

Hystrix EIP

Essayons maintenant Hystrix EIP. Tout d'abord, ajoutez les bibliothèques suivantes. x.x.x spécifie la version de Camel que vous utilisez.

pom.xml


<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-hystrix</artifactId>
    <version>x.x.x</version>
</dependency>

Hystrix a de nombreuses options et peut être défini comme suit:

--Réglez le délai d'expiration à 5 secondes (executionTimeoutInMilliseconds).

						.hystrixConfiguration()
							.circuitBreakerErrorThresholdPercentage(20)
							.executionTimeoutInMilliseconds(5000)
							.circuitBreakerSleepWindowInMilliseconds(5000)
							.circuitBreakerRequestVolumeThreshold(2)

Dans le cas de XML DSL, la description est la suivante.

		<route id="main_route">
			<from uri="timer:trigger?period=300" />
				<log message="Client request" />
				<hystrix>
					<hystrixConfiguration circuitBreakerErrorThresholdPercentage="20" executionTimeoutInMilliseconds="5000" circuitBreakerSleepWindowInMilliseconds="5000" circuitBreakerRequestVolumeThreshold="2" />
					<to uri="http4://localhost:8888/hello"/>
					<onFallback>
						<transform>
							<constant>Fallback message</constant>
						</transform>
					</onFallback>
				</hystrix>
			    <log message="response: ${body}" />
		</route>

Créez ce qui suit comme itinéraire pour essayer le réglage du disjoncteur plus tôt. Cette route est traitée par le composant Timer toutes les 300 ms. Il est conçu pour faire une requête au système distant avec "to (" http4: // localhost: 8888 / hello ")".

			public void configure() throws Exception {
				from("timer:trigger?period=300")
					.log("Client request")
					.hystrix()
						.hystrixConfiguration()
							.circuitBreakerErrorThresholdPercentage(20)
							.executionTimeoutInMilliseconds(5000)
							.circuitBreakerSleepWindowInMilliseconds(5000)
							.circuitBreakerRequestVolumeThreshold(2)
						.end()
						.to("http4://localhost:8888/hello")
					.end()
					.log("response: ${body}");
			}

Se retirer

Hystrix prend également en charge le repli. Le repli est une opération rétractée (Kana?) En japonais, ce qui signifie limiter les fonctions. Dans Hystrix, la méthode onFallback est appelée lorsque l'erreur dépasse le seuil. La source ci-dessus est conçue pour stocker le message de secours dans le CORPS du message. Dans l'état Closed, le thread qui exécute la commande et le thread qui retombe sont séparés afin qu'ils n'affectent pas l'exécution de la commande.

En outre, en remplacement, il existe la méthode onFallback et la méthode onFallbackViaNetwork. Utilisez la méthode onFallback pour gérer le repli dans la même application et la méthode onFallbackViaNetwork pour appeler les services distants. La méthode onFallbackViaNetwork possède son propre pool de threads pour une isolation complète des threads. Cela sépare complètement les threads même à l'état OUVERT.

Si vous sortez le journal avec la méthode onFallbackViaNetwork, le nom du thread sera "hystrix-CamelHystrix-10" comme indiqué ci-dessous, et vous pouvez voir qu'il s'agit d'un thread séparé.

[2019-02-06 20:32:38.985], [INFO ], route1, hystrix-CamelHystrix-10, route1, Fallback message

Propriété

Le tableau ci-dessous répertorie certaines des propriétés qui sont souvent utilisées.

Nom de la propriété Valeur par défaut type La description
circuitBreakerErrorThresholdPercentage 50 Integer Cette propriété définit le taux d'erreur auquel le circuit se déclenche et lance une requête courte à la logique de secours.
circuitBreakerRequestVolumeThreshold 20 Integer Cette propriété définit le nombre minimum de requêtes pour déclencher (ouvrir) un circuit dans une fenêtre.
circuitBreakerSleepWindowInMilliseconds 5000 Integer Cette propriété définit la durée après un déclenchement de circuit avant de refuser la demande avant de lui permettre de réessayer si le circuit doit être refermé.
executionTimeoutInMilliseconds 1000 Integer Cette propriété définit le délai d'expiration de l'exécution en millisecondes.

Pour les autres propriétés, reportez-vous au site officiel ci-dessous.

Vérifiez l'état avec JMX

Vous pouvez obtenir les valeurs de diverses propriétés d'Hystrix avec JMX. Voici un exemple d'affichage des informations JMX à l'aide de hawtio.

image.png

Les trois suivants sont particulièrement importants.

Voici la source complète, y compris la méthode principale.

	public static void main(String[] args) {
		try {
			CamelContext context = new DefaultCamelContext();
			context.addRoutes(createRouteBuilder());

			context.start();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	static RouteBuilder createRouteBuilder() {
        return new RouteBuilder() {
			public void configure() throws Exception {
				from("timer:trigger?period=300")
					.log("Client request")
					.hystrix()
						.hystrixConfiguration()
							.circuitBreakerErrorThresholdPercentage(20)
							.executionTimeoutInMilliseconds(5000)
							.circuitBreakerSleepWindowInMilliseconds(5000)
							.circuitBreakerRequestVolumeThreshold(2)
						.end()
						.to("http4://localhost:8888/hello")
					.end()
					.log("response: ${body}");
			}
        };
    }

référence

Recommended Posts

Modèle de disjoncteur avec Apache Camel
Modèle de disjoncteur avec Apache Camel, partie 2 (essayez le tableau de bord Hystrix)
Modèle de disjoncteur que j'ai vérifié
Hello World (application console) avec Apache Camel + Spring Boot 2
Échantillon répété avec Apache Freemarker
Démarrez Apache Solr avec Embedded.
[Apache Camel] Utiliser le composant File
Sortie CSV par Apache Commons CSV
Accédez à Apache Kafka avec Micronaut
Quoi de neuf dans Apache Camel 2.19.0
Manipuler Excel avec Apache POI