Warteschlangen und JMeter: Austausch mit Publisher und Subscriber

Hallo, Habr! Dies ist die Fortsetzung meines vorherige Veröffentlichung, in der ich ĂŒber die Möglichkeiten der Nachrichtenplatzierung in Warteschlangen mit JMeter berichten werde.

Wir erstellen eine Datenpipeline fĂŒr ein großes nationales Unternehmen. Verschiedene Anfrageformate, Transformationen, komplexe RoutenfĂŒhrungen. FĂŒr Tests mĂŒssen viele Nachrichten in die Warteschlangen gesendet werden. Manuell – ein Schmerz, mit dem nicht jeder Tester umgehen kann.

Warteschlangen und JMeter: Austausch mit Publisher und Subscriber

EinfĂŒhrung

Obwohl wir uns in den Anfangszeiten mit diesem Schmerz arrangieren mussten. Alles begann mit RFHUtil. Leistungsstark, aber unbequem und gruselig: Ihr wisst schon, wie es zu Russisch ist.

Warteschlangen und JMeter: Austausch mit Publisher und Subscriber

Unverzichtbar in bestimmten FĂ€llen, aber stabil abstĂŒrzend bei aktiver Nutzung.
Bequemes Testen ist damit unmöglich.

Mit JMeter wurde alles einfacher. Nach der ersten Phase des Lernens und Eingewöhnens dĂ€mmerte die Hoffnung auf glĂŒckliches Testen.

Ich nutze aktiv die JMS Publisher- und JMS Subscriber-Sampler. Im Gegensatz zu JMS Point-to-Point scheint dieses Duo angenehmer in der Anwendung zu sein. Zum Beispiel kann man beim Subscriber im JMS Selector eine Variable angeben, beim Point-to-Point - nicht (oder dieser Weg ist nicht besonders offensichtlich).

Vorbereitung der Sampler

JMS Publisher

  • Setup - Jede Probe. Apache empfiehlt verwenden Sie diese Option, wenn Warteschlangen/Themen ĂŒber Variablen festgelegt sind.
  • Ablauf (ms) = 120000. Im Falle eines Fehlers verschwinden die Testanfragen nach 2 Minuten aus der Warteschlange.
  • Nicht-bestĂ€ndige Lieferart verwenden? - wahr. IBM stellt fest, dass der bestĂ€ndige Modus eine zuverlĂ€ssige Speicherung der ĂŒbertragenden Nachrichten im Falle eines plötzlichen Ausfalls gewĂ€hrleistet. Und schnelleren Austausch im nicht-bestĂ€ndigen Modus. FĂŒr Testzwecke ist die Geschwindigkeit wichtiger.

In jedem Publisher lege ich eine JMS-Eigenschaft fest, die der Subscriber im JMS Selector verwenden wird. FĂŒr jede Sendung wird ein zufĂ€lliger Wert im Element des Testplans Benutzerparameter generiert:

Warteschlangen und JMeter: Austausch mit Publisher und Subscriber

So kann man sicher sein, dass die richtige Nachricht gelesen wird.

Die endgĂŒltige "Dummie" des vorkonfigurierten JMS Publishers:

Warteschlangen und JMeter: Austausch mit Publisher und Subscriber

JMS Subscriber

  • Setup - Jede Probe. Ihr habt es verstanden.
  • Timeout (ms) = 100000. Wenn die Anfrage nach 100 Sekunden Wartezeit nicht in der Warteschlange ankommt, ist etwas schief gelaufen.
  • Zwischen den Proben stoppen? - wahr.

JMS Selector - eine recht praktische Sache. Der endgĂŒltige JMS Subscriber:

Warteschlangen und JMeter: Austausch mit Publisher und Subscriber

Wie man mit der Kyrillik in ĂŒbertragenden Nachrichten umgeht. In JMeter wird sie standardmĂ€ĂŸig nach dem Auslesen schief angezeigt. Um dies zu vermeiden und die große und mĂ€chtige Sprache jederzeit und ĂŒberall zu genießen, muss man:

  1. Einen JVM-Parameter zum "Launcher" JMeter hinzufĂŒgen:
    -Dfile.encoding=UTF-8
  2. Einen JSR223 PostProcessor im Subscriber mit der Zeile in Groovy hinzufĂŒgen:
    prev.setDataEncoding("UTF-8")

TextĂŒbertragung

Die faulste Option. Geeignet fĂŒr das Debuggen frisch geschriebener Tests. Oder in FĂ€llen, in denen man wenigstens etwas Kleines senden muss. Option auswĂ€hlen Nachrichtenquelle — Textbereich und den Nachrichtentext im Textblock platzieren:

Warteschlangen und JMeter: Austausch mit Publisher und Subscriber

DateiĂŒbertragung

Die hĂ€ufigste Option. Geeignet fĂŒr die meisten Szenarien. Option auswĂ€hlen Nachrichtenquelle — Von Datei und den Pfad zur Nachricht im Feld angeben Datei — Dateiname:

Warteschlangen und JMeter: Austausch mit Publisher und Subscriber

DateiĂŒbertragung im Textfeld

Die universellste Option. Geeignet fĂŒr die meisten Szenarien + kann in JMS Point-to-Point verwendet werden, bei dem es keine zweite Versandoption gibt:

Warteschlangen und JMeter: Austausch mit Publisher und Subscriber

Übertragung von Bytearrays

Die komplexeste Option. Geeignet fĂŒr die prĂ€zise ÜberprĂŒfung der AnfrageĂŒbertragung bis zum Byte, ohne Verzerrungen, SMS oder Störungen. Dies ist nicht mit dem Standard-JMeter möglich, hier wurde mir deutlich gesagt.

Deshalb musste ich herunterladen Quellcode und modifizieren Code JMS Subscriber.

Ich habe in der Methode extractContent(..) die Zeile ersetzt:

buffer.append(bytesMessage.getBodyLength() + " Bytes erhalten in BytesMessage");

auf:

byte[] bytes = new byte[(int) bytesMessage.getBodyLength()];
bytesMessage.readBytes(bytes);
try {
	buffer.append(new String(bytes, "UTF-8"));
} catch (UnsupportedEncodingException e) {
	throw new RuntimeException(e);
}

und JMeter neu kompiliert.

Es bleibt, ein paar JSR223 Sampler hinzuzufĂŒgen. Der erste — vor dem Paar Publisher/Subscriber zur Erstellung einer DAT-Datei, die zufĂ€llige Bytes enthĂ€lt:

import org.apache.commons.lang3.RandomUtils;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

vars.put("PATH_TO_BYTES", "C:temprandomBytes.dat");
File RESULT_FILE = new File(vars.get("PATH_TO_BYTES"));
byte[] arr = RandomUtils.nextBytes((int)(Math.random()*10000));
        try {
            FileOutputStream fos = new FileOutputStream(RESULT_FILE);
            fos.write(arr);
            fos.close();
        } catch (IOException e) {
            System.out.println("Datei nicht gefunden");
        }

Der zweite — am Ende des Szenarios, löscht die Datei:

import java.io.File;

File RESULT_FILE = new File(vars.get("PATH_TO_BYTES"));
RESULT_FILE.delete();

Und nicht vergessen, den Datei-Pfad beim Publisher hinzuzufĂŒgen:

Warteschlangen und JMeter: Austausch mit Publisher und Subscriber

Und auch die ÜberprĂŒfung in der JSR223 Assertion fĂŒr Subscriber — um die ursprĂŒnglichen Bytes mit denen zu vergleichen, die in der Warteschlange des EmpfĂ€ngers ankommen:

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;

Path path = Paths.get(vars.get("PATH_TO_BYTES"), new String[0]);
byte[] originalArray = Files.readAllBytes(path);
byte[] changedArray = ctx.getPreviousResult().getResponseData();
System.out.println(changedArray.length);

if (Arrays.equals(originalArray, changedArray))
	{
     	SampleResult.setResponseMessage("OK");

	} else {
	   SampleResult.setSuccessful(false);
     	   SampleResult.setResponseMessage("Vergleich fehlgeschlagen");
	   SampleResult.setResponseData("Bytes haben sich geÀndert","UTF-8");
     	   IsSuccess=false;
	}

Fazit

Ich habe vier Methoden zur Übermittlung von Nachrichten in Warteschlangen beschrieben, die ich tĂ€glich in der Praxis anwende. Ich hoffe, diese Informationen erleichtern Ihnen das Leben. Ich plane, in der Fortsetzung ĂŒber meine Erfahrungen beim Testen des Austauschs zu berichten, bei dem auf der einen Seite die Warteschlange und auf der anderen Seite die Datenbank oder das Dateisystem steht.

SchĂŒtzen Sie Ihre Zeit. Vielen Dank fĂŒr Ihre Aufmerksamkeit.

Warteschlangen und JMeter: Austausch mit Publisher und Subscriber

Quelle: habr.com

ZuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz kaufen, VPS VDS Server đŸ”„ ZuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz kaufen, VPS VDS Server - ProHoster