Migrowanie istniejących aplikacji usługi Java Message Service (JMS) 2.0 z usługi Apache ActiveMQ do usługi Azure Service Bus

W tym artykule omówiono sposób modyfikowania istniejącej aplikacji usługi Java Message Service (JMS) 2.0, która współdziała z brokerem JMS w celu interakcji z usługą Azure Service Bus. W szczególności artykuł obejmuje migrację z platformy Apache ActiveMQ lub Amazon MQ.

Usługa Azure Service Bus obsługuje obciążenia Java 2 Platform, Enterprise Edition i Spring korzystające z interfejsu API JMS 2.0 za pośrednictwem protokołu Advanced Message Queueing Protocol (AMQP).

Przed rozpoczęciem

Różnice między usługami Azure Service Bus i Apache ActiveMQ

Usługi Azure Service Bus i Apache ActiveMQ to brokerzy komunikatów, którzy działają jako dostawcy JMS dla aplikacji klienckich w celu wysyłania komunikatów do i odbierania komunikatów. Obie te elementy umożliwiają semantyka punkt-punkt z kolejkami oraz semantyka publikowania-subskrybowania z tematami i subskrypcjami.

Mimo to istnieją pewne różnice między nimi, jak pokazano w poniższej tabeli:

Kategoria ActiveMQ Azure Service Bus
Warstwowanie aplikacji Monolityczny klastrowany Dwuwarstwowa
(brama i zaplecze)
Obsługa protokołów
  • AMQP
  • STOMP
  • OpenWire
AMQP
Tryb aprowizacji
  • Infrastruktura jako usługa (IaaS), lokalna
  • Amazon MQ (zarządzana platforma jako usługa)
Zarządzana platforma jako usługa (PaaS)
Rozmiar komunikatu Możliwe do skonfigurowania przez klienta 100 MB (warstwa Premium)
Wysoka dostępność Zarządzane przez klienta Zarządzane przez platformę
Odzyskiwanie po awarii Zarządzane przez klienta Zarządzane przez platformę

Bieżące obsługiwane i nieobsługiwane funkcje

W poniższej tabeli wymieniono funkcje usługi Java Message Service (JMS), które obecnie obsługuje usługa Azure Service Bus. Pokazuje również funkcje, które nie są obsługiwane.

Funkcja Interfejs API Status
Kolejki
  • JMSContext.createQueue( String queueName)
Obsługiwane
Tematy
  • JMSContext.createTopic( Nazwa tematu ciągu)
Obsługiwane
Kolejki tymczasowe
  • JMSContext.createTemporaryQueue()
Obsługiwane
Tematy tymczasowe
  • JMSContext.createTemporaryTopic()
Obsługiwane
Producent wiadomości /
JMSProducer
  • JMSContext.createProducer()
Obsługiwane
Przeglądarki kolejek
  • JMSContext.createBrowser(Kolejka kolejki)
  • JMSContext.createBrowser(kolejka kolejki, komunikat ciąguSelector)
Obsługiwane
Odbiorca wiadomości/
JMSConsumer
  • JMSContext.createConsumer( Miejsce docelowe)
  • JMSContext.createConsumer( Miejsce docelowe, Ciąg messageSelector)
  • JMSContext.createConsumer( Miejsce docelowe, MessageSelector ciągów, wartość logiczna noLocal)

noLocal nie jest obecnie obsługiwany
Obsługiwane
Udostępnione trwałe subskrypcje
  • JMSContext.createSharedDurableConsumer(temat tematu, nazwa ciągu)
  • JMSContext.createSharedDurableConsumer(temat tematu, nazwa ciągu, messageSelector ciągu)
Obsługiwane
Nieudostępniane trwałe subskrypcje
  • JMSContext.createDurableConsumer(Temat, Nazwa ciągu)
  • createDurableConsumer(temat tematu, nazwa ciągu, message MessageSelector, wartość logiczna noLocal)

wartość noLocal nie jest obecnie obsługiwana i powinna być ustawiona na wartość false
Obsługiwane
Udostępnione subskrypcje nietrwałe
  • JMSContext.createSharedConsumer(Temat, String sharedSubscriptionName)
  • JMSContext.createSharedConsumer(Temat, String sharedSubscriptionName, String messageSelector)
Obsługiwane
Nieudostępne subskrypcje nietrwałe
  • JMSContext.createConsumer(Miejsce docelowe)
  • JMSContext.createConsumer( Miejsce docelowe, Ciąg messageSelector)
  • JMSContext.createConsumer( Miejsce docelowe, MessageSelector ciągów, wartość logiczna noLocal)

wartość noLocal nie jest obecnie obsługiwana i powinna być ustawiona na wartość false
Obsługiwane
Selektory komunikatów zależy od utworzonego konsumenta Obsługiwane
Opóźnienie dostarczania (zaplanowane komunikaty)
  • JMSProducer.setDeliveryDelay( długa dostawaDelay)
Obsługiwane
Utworzono komunikat
  • JMSContext.createMessage()
  • JMSContext.createBytesMessage()
  • JMSContext.createMapMessage()
  • JMSContext.createObjectMessage( Obiekt z możliwością serializacji)
  • JMSContext.createStreamMessage()
  • JMSContext.createTextMessage()
  • JMSContext.createTextMessage( Tekst ciągu)
Obsługiwane
Transakcje między jednostkami
  • Połączenie ion.createSession(true, Session.SESSION_TRANSACTED)
Obsługiwane
Transakcje rozproszone Nieobsługiwane

Kwestie wymagające rozważenia

Dwuwarstwowy charakter usługi Azure Service Bus zapewnia różne możliwości ciągłości działania (wysoka dostępność i odzyskiwanie po awarii). Jednak podczas korzystania z funkcji JMS należy wziąć pod uwagę pewne kwestie.

Uaktualnienia usług

W przypadku uaktualnień i ponownych uruchomień magistrali usług tymczasowe kolejki lub tematy są usuwane. Jeśli aplikacja jest wrażliwa na utratę danych w tymczasowych kolejkach lub tematach, nie używaj tymczasowych kolejek ani tematów. Zamiast tego używaj trwałych kolejek, tematów i subskrypcji.

Migracja danych

W ramach migracji i modyfikowania aplikacji klienckich w celu interakcji z usługą Azure Service Bus dane przechowywane w usłudze ActiveMQ nie są migrowane do usługi Service Bus. Może być potrzebna aplikacja niestandardowa do opróżniania kolejek, tematów i subskrypcji ActiveMQ, a następnie ponownego odtwarzania komunikatów do kolejek, tematów i subskrypcji usługi Service Bus.

Uwierzytelnianie i autoryzacja

Kontrola dostępu oparta na rolach (Azure RBAC) oparta na rolach platformy Azure, wspierana przez identyfikator Firmy Microsoft, jest preferowanym mechanizmem uwierzytelniania dla usługi Service Bus. Aby włączyć kontrolę dostępu opartą na rolach, wykonaj kroki opisane w przewodniku dewelopera dla deweloperów usługi Azure Service Bus JMS 2.0.

Przed migracją

Sprawdzanie wersji

Podczas pisania aplikacji JMS są używane następujące składniki i wersje:

Składnik Wersja
Interfejs API usługi komunikatów Java (JMS) 1.1 lub nowsza
Protokół AMQP 1.0

Upewnij się, że porty protokołu AMQP są otwarte

Usługa Service Bus obsługuje komunikację za pośrednictwem protokołu AMQP. W tym celu włącz komunikację za pośrednictwem portów 5671 (AMQP) i 443 (TCP). W zależności od tego, gdzie są hostowane aplikacje klienckie, może być potrzebny bilet pomocy technicznej, aby umożliwić komunikację za pośrednictwem tych portów.

Ważne

Usługa Service Bus obsługuje tylko protokół AMQP 1.0.

Konfigurowanie konfiguracji przedsiębiorstwa

Usługa Service Bus umożliwia korzystanie z różnych funkcji zabezpieczeń i wysokiej dostępności przedsiębiorstwa. Aby uzyskać więcej informacji, zobacz:

Monitorowanie, alerty i śledzenie

Dla każdej przestrzeni nazw usługi Service Bus publikujesz metryki w usłudze Azure Monitor. Te metryki umożliwiają alerty i dynamiczne skalowanie zasobów przydzielonych do przestrzeni nazw.

Aby uzyskać więcej informacji na temat różnych metryk i sposobu ich konfigurowania, zobacz Metryki usługi Service Bus w usłudze Azure Monitor. Możesz również dowiedzieć się więcej na temat śledzenia po stronie klienta dla operacji danych i rejestrowania operacyjnego/diagnostycznego na potrzeby operacji zarządzania.

Metryki — nowa relica

Możesz skorelować metryki z mapy ActiveMQ, do których metryk w usłudze Azure Service Bus. Zobacz następujące informacje w witrynie internetowej New Relic:

Uwaga

Obecnie usługa New Relic nie ma bezpośredniej, bezproblemowej integracji z usługą ActiveMQ, ale ma dostępne metryki dla usługi Amazon MQ. Ponieważ usługa Amazon MQ pochodzi z usługi ActiveMQ, poniższa tabela mapuje nowe metryki Relic z usługi Amazon MQ na usługę Azure Service Bus.

Grupowanie metryk Metryka Amazon MQ/ActiveMQ Metryka usługi Azure Service Bus
Broker CpuUtilization CPUXNS
Broker MemoryUsage WSXNS
Broker CurrentConnectionsCount activeConnections
Broker EstablishedConnectionsCount activeConnections + connectionsClosed
Broker InactiveDurableTopicSubscribersCount Korzystanie z metryk subskrypcji
Broker TotalMessageCount Korzystanie z poziomu kolejki/tematu/subskrypcji activeMessages
Kolejka/temat EnqueueCount incomingMessages
Kolejka/temat DequeueCount outgoingMessages
Kolejka QueueSize sizeBytes

Migracja

Aby przeprowadzić migrację istniejącej aplikacji JMS 2.0 w celu interakcji z usługą Service Bus, wykonaj kroki opisane w następnych kilku sekcjach.

Eksportowanie topologii z usługi ActiveMQ i tworzenie jednostek w usłudze Service Bus (opcjonalnie)

Aby upewnić się, że aplikacje klienckie mogą bezproblemowo łączyć się z usługą Service Bus, migrować topologię (w tym kolejki, tematy i subskrypcje) z usługi Apache ActiveMQ do usługi Service Bus.

Uwaga

W przypadku aplikacji JMS można tworzyć kolejki, tematy i subskrypcje jako operację środowiska uruchomieniowego. Większość dostawców JMS (brokerów komunikatów) daje możliwość tworzenia ich w czasie wykonywania. Dlatego ten krok eksportu jest uznawany za opcjonalny. Aby upewnić się, że aplikacja ma uprawnienia do tworzenia topologii w czasie wykonywania, użyj parametry połączenia z uprawnieniami sygnatury dostępu współdzielonegoManage.

Czynności:

  1. Użyj narzędzi wiersza polecenia ActiveMQ, aby wyeksportować topologię.
  2. Utwórz ponownie tę samą topologię przy użyciu szablonu usługi Azure Resource Manager.
  3. Uruchom szablon usługi Azure Resource Manager.

Importowanie zależności maven dla implementacji programu JMS usługi Service Bus

Aby zapewnić bezproblemową łączność z usługą Service Bus, dodaj azure-servicebus-jms pakiet jako zależność do pliku Maven pom.xml w następujący sposób:

<dependencies>
...
    <dependency>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>azure-servicebus-jms</artifactId>
    </dependency>
...
</dependencies>

Zmiany konfiguracji serwera aplikacji

Ta część jest dostosowywana do serwera aplikacji hostujących aplikacje klienckie łączące się z usługą ActiveMQ.

Aplikacje Spring

application.properties Aktualizowanie pliku

Jeśli używasz aplikacji Spring Boot do nawiązywania połączenia z usługą ActiveMQ, chcesz usunąć właściwości specyficzne dla usługi ActiveMQ z application.properties pliku.

spring.activemq.broker-url=<ACTIVEMQ BROKER URL>
spring.activemq.user=<ACTIVEMQ USERNAME>
spring.activemq.password=<ACTIVEMQ PASSWORD>

Następnie dodaj właściwości specyficzne dla usługi Service Bus do application.properties pliku.

azure.servicebus.connection-string=Endpoint=myEndpoint;SharedAccessKeyName=mySharedAccessKeyName;SharedAccessKey=mySharedAccessKey
Zastąp ciąg ActiveMQConnectionFactory ciągiem ServiceBusJmsConnectionFactory

Następnym krokiem jest zastąpienie wystąpienia elementem ActiveMQConnectionFactoryServiceBusJmsConnectionFactory.

Uwaga

Rzeczywiste zmiany kodu są specyficzne dla aplikacji i sposobu zarządzania zależnościami, ale poniższy przykład zawiera wskazówki dotyczące tego, co należy zmienić.

Wcześniej można było utworzyć wystąpienie obiektu ActiveMQConnectionFactory, w następujący sposób:


String BROKER_URL = "<URL of the hosted ActiveMQ broker>";
ConnectionFactory factory = new ActiveMQConnectionFactory(BROKER_URL);

Connection connection = factory.createConnection();
connection.start();

Teraz zmieniasz tę funkcję, aby utworzyć wystąpienie obiektu ServiceBusJmsConnectionFactory, w następujący sposób:


ServiceBusJmsConnectionFactorySettings settings = new ServiceBusJmsConnectionFactorySettings();
String SERVICE_BUS_CONNECTION_STRING = "<Service Bus Connection string>";

ConnectionFactory factory = new ServiceBusJmsConnectionFactory(SERVICE_BUS_CONNECTION_STRING, settings);

Connection connection = factory.createConnection();
connection.start();

Po migracji

Po zmodyfikowaniu aplikacji w celu rozpoczęcia wysyłania i odbierania komunikatów z usługi Service Bus należy sprawdzić, czy działa zgodnie z oczekiwaniami. Po zakończeniu możesz przejść do dalszego uściślinia i modernizacji stosu aplikacji.

Następne kroki

Użyj szablonu startowego Spring Boot dla usługi Azure Service Bus JMS w celu bezproblemowej integracji z usługą Service Bus.

Aby dowiedzieć się więcej na temat komunikatów usługi Service Bus i JMS, zobacz: