[JAVA] Leistungsschaltermuster mit Apache-Kamel

Leistungsschaltermuster

Das Leistungsschaltermuster ist eines der Entwurfsmuster. Wenn eine Anwendung auf einen Remotedienst zugreift, kann ein vorübergehender Fehler aufgrund einer hohen Last oder eines DB-Failovers auftreten. Dies ist ein vorübergehender Fehler. Wenn Sie warten, bis er wiederhergestellt ist, ist der Vorgang ohne Fehler erfolgreich.

Dies hat den Vorteil, dass keine große Anzahl von Fehlern verursacht wird, die Verarbeitung nicht fortgesetzt wird, da bekannt ist, dass ein Fehler auftritt, und dass die Remote-Seite nicht unnötig belastet wird. Es wird als Leistungsschaltermuster bezeichnet, da es den Leistungsschalter bei hoher Last fallen lässt.

Der Leistungsschalter hat die folgenden drei Zustände.

image.png

Das Leistungsschaltermuster wurde 2007 in dem Buch Release It! Veröffentlicht (?) (Obwohl ich es nur anschaue). Die japanische Version von Relase It! Wurde ebenfalls veröffentlicht, und die folgende zweite Ausgabe wurde ebenfalls 2018 veröffentlicht (keine japanische Version).

Das Leistungsschaltermuster finden Sie auch in Martin Fowlers Blog.

Es gibt auch Teil 2 dieses Artikels. Leistungsschaltermuster mit Apache Camel Teil 2 (Hystrix Dashboard ausprobieren)

Verwenden Sie das Leistungsschaltermuster in Apache Camel

Mit Apache Camel können Sie die folgenden zwei Leistungsschalter nutzen:

Der Leistungsschalter-Lastausgleich ist eine einfache Implementierung, die ein Leistungsschaltermuster realisiert. Es hat weniger Funktionen als das Hystrix EIP, ist aber einfach zu bedienen. Da es in Version 2.23.0 jedoch veraltet ist, müssen Sie das folgende Hystrix-EIP verwenden. Hystrix EIP ist eine Komponente zur Verwendung von Camel mit einer von NetFlix entwickelten Bibliothek für Fehlertoleranz namens Hystrix. Hystrix hat auch viele Funktionen als Leistungsschalter.

Für Hystrix EIP werde ich ein Beispielprogramm erstellen und es später ausführen.

Die offiziellen Websites von Circuit Breaker Load Balancer und Hystrix EIP lauten wie folgt.

Hystrix EIP

Versuchen wir jetzt Hystrix EIP. Fügen Sie zunächst die folgenden Bibliotheken hinzu. x.x.x gibt die Version von Camel an, die Sie verwenden.

pom.xml


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

Hystrix hat viele Optionen und kann wie folgt eingestellt werden:

--Stellen Sie das Timeout auf 5 Sekunden ein (ExecutionTimeoutInMilliseconds).

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

Im Fall von XML DSL lautet die Beschreibung wie folgt.

		<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>

Erstellen Sie Folgendes als Route, um die Einstellung des Leistungsschalters früher zu testen. Diese Route wird alle 300 ms von der Timer-Komponente verarbeitet. Es wurde entwickelt, um eine Anforderung an das Remote-System mit "to (" http4: // localhost: 8888 / hello ")" zu senden.

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

Zurückfallen

Hystrix unterstützt auch Fallback. Fallback ist eine zurückgezogene Operation (Kana?). Auf Japanisch bedeutet dies, die Funktionen einzuschränken. In Hystrix wird die onFallback-Methode aufgerufen, wenn der Fehler den Schwellenwert überschreitet. Die obige Quelle dient zum Speichern der Fallback-Nachricht im KÖRPER der Nachricht. Im geschlossenen Zustand sind der Thread, der den Befehl ausführt, und der Thread, der zurückfällt, getrennt, sodass sie die Ausführung des Befehls nicht beeinflussen.

Im Fallback gibt es außerdem die onFallback-Methode und die onFallbackViaNetwork-Methode. Verwenden Sie die onFallback-Methode, um Fallback innerhalb derselben App zu verarbeiten, und die onFallbackViaNetwork-Methode, um Remotedienste aufzurufen. Die onFallbackViaNetwork-Methode verfügt über einen eigenen Thread-Pool für die vollständige Thread-Isolation. Dadurch werden die Threads auch im OPEN-Zustand vollständig getrennt.

Wenn Sie das Protokoll mit der Methode onFallbackViaNetwork ausgeben, lautet der Threadname "hystrix-CamelHystrix-10" (siehe unten), und Sie können sehen, dass es sich um einen separaten Thread handelt.

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

Eigentum

In der folgenden Tabelle sind einige der häufig verwendeten Eigenschaften aufgeführt.

Name des Anwesens Standardwert Art Erläuterung
circuitBreakerErrorThresholdPercentage 50 Integer Diese Eigenschaft legt die Fehlerrate fest, mit der die Schaltung auslöst, und initiiert eine kurze Anforderung an die Fallback-Logik.
circuitBreakerRequestVolumeThreshold 20 Integer Diese Eigenschaft legt die Mindestanzahl von Anforderungen zum Auslösen (Öffnen) eines Stromkreises in einem Fenster fest.
circuitBreakerSleepWindowInMilliseconds 5000 Integer Diese Eigenschaft legt die Zeitspanne nach einer Stromkreisauslösung fest, bevor die Anforderung abgelehnt wird, bevor sie erneut versucht werden kann, wenn der Stromkreis wieder geschlossen werden muss.
executionTimeoutInMilliseconds 1000 Integer Diese Eigenschaft legt das Zeitlimit für die Ausführung in Millisekunden fest.

Weitere Eigenschaften finden Sie auf der offiziellen Website unten.

Überprüfen Sie den Status mit JMX

Mit JMX können Sie die Werte verschiedener Eigenschaften von Hystrix abrufen. Das folgende Beispiel zeigt die Anzeige von JMX-Informationen mit hawtio.

image.png

Die folgenden drei sind besonders wichtig.

Unten finden Sie die gesamte Quelle einschließlich der Hauptmethode.

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

Referenz

Recommended Posts

Leistungsschaltermuster mit Apache-Kamel
Leistungsschaltermuster mit Apache Camel Teil 2 (Probieren Sie das Hystrix Dashboard aus)
Leistungsschaltermuster habe ich überprüft
Hallo Welt (Konsolen-App) mit Apache Camel + Spring Boot 2
Wiederholte Probe mit Apache Freemarker
Starten Sie Apache Solr mit Embedded.
[Apache Camel] Verwenden Sie die Dateikomponente
Greifen Sie mit Micronaut auf Apache Kafka zu
Was ist neu in Apache Camel 2.19.0?
Bearbeiten Sie Excel mit Apache POI