Erfahren Sie, wie Sie den Root-Durchsatz von Apache Camel einfach messen können. Mithilfe der Protokollkomponente in Camel kann die Anzahl der von der Route innerhalb der angegebenen Zeit verarbeiteten Daten in das Protokoll ausgegeben werden.
Geben Sie die Protokollkomponente für den TO-Endpunkt wie folgt an, um den Durchsatz auszugeben.
to("log:example.camelbegginer.throughput.PutThroughput?groupInterval=1000")
Der "example.camelbegginer.throughput.PutThroughput" in diesem Beispiel wird als Protokollierungskategorie bezeichnet und kann mit einem beliebigen Namen versehen werden. Da die Protokollierungskategorie in das Protokoll ausgegeben wird, ist es zweckmäßig, den Namen für jeden zu messenden Prozess zu trennen. Die Option groupInterval gibt den Durchsatz alle 1 Sekunde (1000 Millisekunden) aus.
Das Folgende ist ein Beispiel für die Durchsatzausgabe.
ThroughputLogger, example.camelbegginer.throughput.PutThroughput, Received: 100 new messages, with total 300 so far. Last group took: 1001 millis which is: 99.9 messages per second. average: 103.199
Zunächst gibt "ThroughputLogger, example.camelbegginer.throughput.PutThroughput" den Namen der angegebenen Protokollierungskategorie aus. "Eingegangen: 100 neue Nachrichten, insgesamt 300 bisher. Letzte Gruppe: 1001 Millis" bedeutet, dass 100 neue Nachrichten in 1001 Millisekunden verarbeitet wurden, was insgesamt 300 verarbeitet. Ich habe den Durchsatz so eingestellt, dass er alle 1000 Millisekunden ausgegeben wird, aber er kann um 1 Millisekunde abweichen. "99,9 Nachrichten pro Sekunde. Durchschnitt: 103,199" zeigt an, dass 99,9 Nachrichten in 1 Sekunde verarbeitet werden können und 103,199 Nachrichten im Durchschnitt verarbeitet werden können. Auf diese Weise erleichtert die LOG-Komponente die Ausgabe des Durchsatzes.
Die Optionen für die Durchsatzausgabe sind in der folgenden Tabelle aufgeführt. Zusätzlich zu der folgenden Tabelle verfügt die Protokollkomponente über Optionen wie die Protokollstufe, die jedoch weggelassen werden, da sie nicht direkt mit dem Durchsatz zusammenhängen.
Extras | Standardwert | Erläuterung |
---|---|---|
groupInterval | null | Gibt das Intervall (Millisekunden) an, in dem der Durchsatz ausgegeben wird."1000"Wenn angegeben, wird der Durchsatz pro Sekunde in das Protokoll ausgegeben. groupActiveOnly und groupDelay werden nur verwendet, wenn diese Option angegeben ist. |
groupActiveOnly | true | "true"Wenn diese Option aktiviert ist, wird das Protokoll nur ausgegeben, wenn die Daten während des Ausgabeintervalls gültig sind (mehr als 0). |
groupDelay | 0 | Erste Verzögerungszeit(Millisekunde)Angegeben. |
groupSize | null | Wenn Sie die angegebene Anzahl von Fällen verarbeiten, wird der Durchsatz in das Protokoll ausgegeben."100"Wenn angegeben, wird jedes Mal, wenn 100 Elemente verarbeitet werden, ein Protokoll ausgegeben. Wenn groupSize angegeben ist, ist der für groupInterval angegebene Wert ungültig. |
Hier möchte ich tatsächlich 1000 Daten fließen lassen und sehen, wie der Durchsatz ausgegeben wird.
Bereiten Sie zunächst 1000 Daten vor. Im folgenden Code wird die SimpleDataSet-Klasse verwendet und 1000 Daten werden von der setSize-Methode angegeben. Die SimpleDataSet-Klasse ist eine Testkomponente, mit der Sie auf einfache Weise eine große Datenmenge zur Verwendung in Systemlasttests erstellen können.
SimpleDataSet dataSet = new SimpleDataSet();
dataSet.setSize(1000);
Registrieren Sie als Nächstes eine Instanz der SimpleDataSet-Klasse in der Registrierung und erstellen Sie eine Instanz von CamelContext. Ich habe ein SimpleDataSet mit den 1000 zuvor generierten Daten zur Registrierung hinzugefügt.
SimpleRegistry registry = new SimpleRegistry();
registry.put("testDataSet", dataSet);
CamelContext context = new DefaultCamelContext(registry);
Fügen Sie schließlich eine Route zum CamelContext hinzu, um 1000 Daten zu verarbeiten.
static RouteBuilder createRouteBuilder() {
return new RouteBuilder() {
public void configure() throws Exception {
from("dataset:testDataSet?produceDelay=-1")
.split().simple("${header.CamelDataSetIndex}")
.throttle(100)
.to("log:example.camelbegginer.throughput.PutThroughput?level=INFO&groupInterval=1000");
}
};
}
In "from (" Dataset: testDataSet? ProduceDelay = -1 ")" werden die 1000 zuvor generierten Daten als from-Endpunkt angegeben. In "split (). Simple (" $ {header.CamelDataSetIndex} "). Throttle (100)" wird angegeben, dass 1000 Nachrichten durch den CamelDataSetIndex des Headers aufgeteilt werden und 100 Nachrichten pro Sekunde gesendet werden. Ich werde. CamelDataSetIndex wird von SimpleDataSet automatisch von 1 nummeriert.
Das Ausgabebeispiel für die Protokollausgabe von log4j2 nach Ausführung der Anwendung lautet wie folgt. Sie können sehen, dass das Protokoll jede Sekunde ausgegeben wird und der Durchsatz zu diesem Zeitpunkt angezeigt wird.
[2019-01-13 08:27:46.429], [INFO ], e.c.t.PutThroughput, Camel (camel-1) thread #1 - ThroughputLogger, example.camelbegginer.throughput.PutThroughput, Received: 100 new messages, with total 100 so far. Last group took: 906 millis which is: 110.375 messages per second. average: 110.375
[2019-01-13 08:27:47.422], [INFO ], e.c.t.PutThroughput, Camel (camel-1) thread #1 - ThroughputLogger, example.camelbegginer.throughput.PutThroughput, Received: 100 new messages, with total 200 so far. Last group took: 1000 millis which is: 100 messages per second. average: 104.932
[2019-01-13 08:27:48.423], [INFO ], e.c.t.PutThroughput, Camel (camel-1) thread #1 - ThroughputLogger, example.camelbegginer.throughput.PutThroughput, Received: 100 new messages, with total 300 so far. Last group took: 1001 millis which is: 99.9 messages per second. average: 103.199
[2019-01-13 08:27:49.421], [INFO ], e.c.t.PutThroughput, Camel (camel-1) thread #1 - ThroughputLogger, example.camelbegginer.throughput.PutThroughput, Received: 100 new messages, with total 400 so far. Last group took: 998 millis which is: 100.2 messages per second. average: 102.433
[2019-01-13 08:27:50.422], [INFO ], e.c.t.PutThroughput, Camel (camel-1) thread #1 - ThroughputLogger, example.camelbegginer.throughput.PutThroughput, Received: 100 new messages, with total 500 so far. Last group took: 1001 millis which is: 99.9 messages per second. average: 101.916
[2019-01-13 08:27:51.423], [INFO ], e.c.t.PutThroughput, Camel (camel-1) thread #1 - ThroughputLogger, example.camelbegginer.throughput.PutThroughput, Received: 100 new messages, with total 600 so far. Last group took: 1001 millis which is: 99.9 messages per second. average: 101.574
[2019-01-13 08:27:52.421], [INFO ], e.c.t.PutThroughput, Camel (camel-1) thread #1 - ThroughputLogger, example.camelbegginer.throughput.PutThroughput, Received: 100 new messages, with total 700 so far. Last group took: 998 millis which is: 100.2 messages per second. average: 101.376
Das gesamte Beispielprogramm ist diesmal wie folgt.
package example.camelbegginer.throughput;
import org.apache.camel.CamelContext;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.dataset.SimpleDataSet;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.camel.impl.SimpleRegistry;
public class PutThroughput {
public static void main(String[] args) {
try {
SimpleDataSet dataSet = new SimpleDataSet();
dataSet.setSize(1000);
SimpleRegistry registry = new SimpleRegistry();
registry.put("testDataSet", dataSet);
CamelContext context = new DefaultCamelContext(registry);
context.addRoutes(createRouteBuilder());
context.start();
Thread.sleep(20000);
context.stop();
} catch (Exception e) {
e.printStackTrace();
}
}
static RouteBuilder createRouteBuilder() {
return new RouteBuilder() {
public void configure() throws Exception {
from("dataset:testDataSet?produceDelay=-1")
.split().simple("${header.CamelDataSetIndex}")
.throttle(100)
.to("log:example.camelbegginer.throughput.PutThroughput?level=INFO&groupInterval=1000");
}
};
}
}
Mit Apache Camel konnten wir den Durchsatz wie oben beschrieben einfach protokollieren. Ich denke, dass diese Durchsatzausgabe in den folgenden Fällen verwendet werden kann.
--Überprüfen Sie den Durchsatz probeweise während eines Unit-Tests. Sie können überprüfen, ob eine Parallelverarbeitung möglich ist.
Da die Durchsatzleistung gering ist, kann diese Funktion auch in einer Produktionsumgebung voll genutzt werden.
Recommended Posts