fb
Nachrichten 3 min

Beibehalten der Nachrichtenreihenfolge mit mehreren WSO2-JMS-Proxys und ActiveMQ

pumudu
Pumudu Ruhunage
Integration Consultant
messag order
Scrollen

(im WSO2 High Availability Setup)

Problemkontext

Wenn JMS-Proxy-Dienste in einem WSO2 EI High Availability (HA) Setup eingesetzt werden, konkurrieren alle JMS-Proxy-Konsumenten um die Nutzung der einzelnen JMS-Warteschlange. Dadurch kann die Reihenfolge der Nachrichten für das/die Zielsystem(e) nicht beibehalten werden. Das kann für bestimmte Zielsysteme, bei denen die Nachrichtenreihenfolge eingehalten werden muss, problematisch sein.

jsm proxy
WSO2 EI JMS Proxy HA Setup – Nachrichtenreihenfolge wird für Zielsystem(e) nicht beibehalten

In dem oben erwähnten Setup konkurrieren alle JMS-Konsumenten um die Nachrichten, und das Zielsystem empfängt die Nachrichten nicht in der richtigen Reihenfolge. Obwohl die JMS-Warteschlange nach dem FIFO-Prinzip (first in first out) arbeitet, hat jeder JMS-Proxy in jedem EI-Knoten eine andere Verarbeitungslatenz, so dass die Reihenfolge der Nachrichten im Zielsystem nicht mehr synchron ist.

Lösung

Um dieses Problem zu lösen, können wir die Funktion Exclusive Consumer [1] in ActiveMQ verwenden. Die Funktion „Exclusive Consumer“ ermöglicht es nur einem JMS-Konsumenten, zu einem bestimmten Zeitpunkt in einer bestimmten Warteschlange aktiv zu sein. Dadurch kann nur ein Konsument JMS-Nachrichten konsumieren – unabhängig von der Anzahl der JMS-Konsumenten, die die jeweilige Warteschlange abonniert haben. Fällt der aktive Konsument aus, wechselt der Broker zum nächsten verbundenen Konsumenten und fährt fort. So wird eine kontinuierliche, geordnete JMS-Nachrichtenzustellung für die nachgelagerten Systeme sichergestellt. Die Funktion „Exclusive Consumer“ ist ab ActiveMQ v4.x standardmäßig in ActiveMQ enthalten.

Um diese Funktion nutzen zu können, muss die JMS-Sitzung beim Erstellen des JMS-Konsumenten mit dem Flag „consumer.exclusive=true“ erstellt werden.

jms proxy2
WSO2 EI JMS Proxy HA Setup – mit Exclusive Consumers

Die folgenden Schritte veranschaulichen, wie diese Funktion im WSO2 JMS-Proxy-Consumer aktiviert und die Funktionalität überprüft wird.

Implementierung

Da Exclusive Consumer eine ActiveMQ-Funktion ist, können wir jede EI-Version verwenden, solange wir mindestens ActiveMQ Version 4.x verwenden. Die folgenden Schritte erläutern, wie diese Funktion in einem lokalen Setup mit zwei EI-Servern und ActiveMQ-Dienst getestet wird.

  • Starten Sie ActiveMQ Server 4.x oder eine neuere Version.
  • Einrichtung des EI-Servers:
    • Konfigurieren Sie zwei EI-Server (im ESB-Profil) mit Port Offset.
    • Konfigurieren Sie den ActiveMQ-Transport auf beiden EI-Servern [2].
    • Starten Sie die EI-Server.
  • Konfigurieren Sie den folgenden JMS-Consumer-Proxy in beiden EI-Servern wie unten dargestellt. Dieser Proxy erstellt ein Serverprotokoll, wenn er eine JMS-Nachricht konsumiert.

Beachten Sie, dass das Exclusive-Consumer-Flag im JMS-Zielparameter wie unten gezeigt konfiguriert ist.

 <?xml-versie = "1.0" encoding = "UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
 name="test.excl.queue"
 startOnLoad="true"
 statistieken = "uitschakelen"
 trace = "uitschakelen"
 transports="jms">
 <target>
 <inSequence>
 <log level="custom">
 <property name="JMSProxy: " value="bericht ontvangen."/>
 </log>
 </inSequence>
 </target>
 <parameter name="transport.jms.SessionAcknowledgement">CLIENT_ACKNOWLEDGE</parameter>
 <parameter name="transport.jms.DestinationType">queue</parameter>
 <parameter name="transport.jms.Destination">test1.Q?consumer.exclusive=true</parameter>
 <parameter name="java.naming.provider.url">failover:(tcp://localhost:61616)</parameter>
 <parameter name="transport.jms.SessionTransacted">true</parameter>
 <parameter name="transport.jms.CacheLevel">consumer</parameter>
 <description/>
</proxy>

Test/Demonstration

Um zu überprüfen, ob die Konfigurationen korrekt durchgeführt wurden.

  • Melden Sie sich bei ActiveMQ an und gehen Sie zum Abschnitt Warteschlange. Unter „test1.Q“ sollten wie unten dargestellt zwei aktive Abonnements vorhanden sein.
testen1
  • Gehen Sie zu „test1.Q“ im Abschnitt JMS-Konsumenten im ActiveMQ-Bedienfeld. Überprüfen Sie, ob zwei Konsumenten mit aktiviertem Exclusive-Flag registriert sind.
test2
  • Wenn das bestätigt ist, werden die Konfigurationen in ActiveMQ übernommen. Senden Sie mehrere Nachrichten über das ActiveMQ-Bedienfeld und beobachten Sie die Bedienfeldprotokolle auf beiden EI-Servern. (Zum Senden von JMS-Nachrichten kann der integrierte ActiveMQ-Nachrichtensender verwendet werden.)
test3

Serverprotokolle bestätigen, dass nur ein JMS-Konsument aktiv Nachrichten konsumiert. Die Nachrichtenreihenfolge bleibt also erhalten.

  • Um das Failover-Szenario von einem JMS-Konsumenten zum anderen zu testen, fahren Sie den aktiven JMS-Konsumentenserver herunter, während Nachrichten kunsumiert werden.
test4

Senden Sie viele (ca. 3000) JMS-Nachrichten über das ActiveMQ-Bedienfeld an die Warteschlange (wie oben dargestellt).

test5

Fahren Sie den EI-Server mit aktivem JMS-Konsumenten herunter, während die Nachrichten konsumiert werden.

test6
Wie aus den Serverprotokollen hervorgeht, hat ActiveMQ erfolgreich zum nächsten verfügbaren JMS-Konsumenten gewechselt, ohne dass Nachrichten verloren gingen.

Diese Demonstration beweist, dass die Funktion Exclusive Consumer von ActiveMQ erfolgreich genutzt werden kann, um Probleme bei der Nachrichtenreihenfolge in einem High Availability EI JMS Proxy Consumer Setup zu lösen.
 
 
[1] https://activemq.apache.org/exclusive-consumer
 
[2] https://docs.wso2.com/display/EI660/Configure+with+ActiveMQ+