Single vs Multi-Threaded JMS Producer
Ich wollte sehen, wie viel Zeitunterschied es bedeuten würde, einen Multi-Threaded-Produzenten anstelle eines Single-Threaded-Produzenten zu verwenden. Ich habe ActiveMQ auf meinem lokalen Computer eingerichtet und eine Producer-Klasse geschrieben, die eine JMS-Verbindung in ihrem Konstruktor initialisiert und startet. Ich habe das Nachrichtenlimit auf 3 Millionen festgelegt und es dauerte ungefähr 50 Sekunden, bis alle Nachrichten an ActiveMQ übermittelt wurden. Ich habe nur eine Zeichenfolge "Hallo Welt" 3M-mal gesendet.
Dann habe ich dasselbe Producer-Objekt (eine Verbindung, aber mehrere Sitzungen) verwendet und es mit einem ExecutorService der Thread-Größe acht ausgeführt. In demrun
Methode würde ich 3M durch 8 teilen, nur um sicherzustellen, dass jeder Thread nicht mehr als 375000 Nachrichten sendet. In diesem Fall dauerte das Pushen aller Nachrichten etwa 60 Sekunden.
ExecutorService service = Executors.newFixedThreadPool(8);
for (int i = 0; i < 8; i++) {
service.execute(producer);
}
Dann habe ich acht Produzenten erstellt, von denen jeder eine eigene Verbindung hat, und sie mit ExecutorService oder Threadgröße acht ausgeführt. Diesmal dauerte es ungefähr 68 Sekunden, bis alle 3M-Nachrichten gesendet wurden.
for (int i = 0; i < 8; i++) {
service.execute(new Producer());
}
Ich frage mich, warum ein einzelner Thread-Produzent hier besser abschneiden würde? Ich habe jedes Szenario ungefähr 10 Mal ausgeführt, aber die Ergebnisse sind gleich geblieben.