(in WSO2 hoge beschikbaarheid configuratie)
Probleemcontext
Wanneer JMS-proxydiensten worden geïmplementeerd in een WSO2 EI-configuratie met hoge beschikbaarheid (HA), concurreren alle JMS-proxygebruikers om te gebruiken uit de enkele JMS-wachtrij. Dit belemmert het behoud van de berichtvolgorde voor het (de) doelsyste(e)m(en). Dit kan problematisch zijn voor bepaalde doelsystemen die de berichtvolgorde moeten behouden.
In de bovenstaande configuratie concurreren alle JMS-gebruikers voor berichten en het doelsysteem zal berichten in de verkeerde volgorde ontvangen. Dit komt omdat, hoewel de JMS-wachtrij zich houdt aan FIFO (first in first out), aangezien elke JMS-proxy in elk EI-kruispunt een andere verwerkingslatentie heeft, dit uiteindelijk leidt tot een niet-gesynchroniseerde berichtvolgorde voor het doelsysteem.
Oplossing
Om dit probleem op te lossen, kunnen we de exclusieve consumentenfunctie [1] in ActiveMQ gebruiken. Met de exclusieve consumentenfunctie kan slechts één JMS-gebruiker op elk moment actief zijn voor een bepaalde wachtrij. Met als resultaat dat slechts één gebruiker JMS-berichten gebruikt, ongeacht het aantal JMS-gebruikers dat is ingeschreven voor de gegeven wachtrij. Als de actieve gebruiker faalt, zal de broker een failover uitvoeren naar de volgende aangesloten gebruiker en doorgaan. Dit zorgt voor een continue geordende JMS-berichtbezorging voor de downstream-systemen. De exclusieve consumentenfunctie is standaard in ActiveMQ opgenomen vanaf ActiveMQ v4.x.
Om deze functie te gebruiken, moet een JMS-sessie worden gemaakt met de markering “consumer.exclusive=true” bij het maken van de JMS-consument.
De volgende stappen illustreren hoe u deze functie in WSO2 JMS proxy gebruiker kunt inschakelen en de functionaliteit kunt verifiëren.
Implementatie
Aangezien de exclusieve gebruiker een ActiveMQ-functie is, kunnen we elke EI-versie gebruiken zolang we ActiveMQ-versie 4.x of hoger gebruiken. In de volgende stappen wordt uitgelegd hoe u deze functie kunt testen in een lokale configuratie met twee EI-servers en ActiveMQ-service.
- Start ActiveMQ-server 4.x of hoger.
- EI-server instellen:
- Configureer twee EI-servers (in ESB-profiel) met poort offset.
- Configureer ActiveMQ-transport in beide EI-servers [2].
- Start EI-servers.
- Configureer de volgende JMS-gebruikersproxy in beide EI-servers zoals hieronder weergegeven. Deze proxy maakt een serverlogboek wanneer het een JMS-bericht gebruikt.
Merk op dat de exclusieve gebruikersmarkering is geconfigureerd in de JMS-bestemmingsparameter, zoals hieronder wordt weergegeven.
<?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>
Testen/demonstratie
Om te controleren of de configuraties correct zijn toegepast.
- Log in op ActiveMQ en ga naar het gedeelte Wachtrij. Onder “test1.Q” zou twee actieve inschrijvingen moeten hebben, zoals hieronder.
- Navigeer naar “test1.Q “JMS-gebruikerssectie in ActiveMQ-console. Controleer of er twee geregistreerde gebruikers zijn met de exclusieve markering ingeschakeld.
- Navigeer naar “test1.Q “JMS-gebruikerssectie in ActiveMQ-console. Controleer of er twee geregistreerde gebruikers zijn met de exclusieve markering ingeschakeld.
Serverlogboeken bevestigen dat slechts één JMS-gebruiker actief berichten gebruikt. Daarom blijft de berichtvolgorde behouden.
- Om het failoverscenario van de ene JMS-gebruiker naar de andere te testen, sluit u de actieve JMS-gebruikersserver af terwijl berichten worden verbruikt.
Stuur een groot aantal (ongeveer 3000) JMS-berichten naar de wachtrij via de ActiveMQ-console (zoals hierboven weergegeven).
Terwijl berichten verbruiken, sluit de EI-server af met een actieve JMS-gebruiker.
Zoals te zien is in de serverlogboeken, is ActiveMQ geslaagd voor failover naar de volgende beschikbare JMS-gebruiker zonder verlies van berichten.
Deze demonstratie bewijst dat de exclusieve gebruikersfunctie van ActiveMQ met succes kan worden gebruikt om problemen met het bestellen van berichten op te lossen in een EI JMS proxy-gebruikersconfiguratie met hoge beschikbaarheid.
[1] https://activemq.apache.org/exclusive-consumer [2] https://docs.wso2.com/display/EI660/Configure+with+ActiveMQ+