기존 JMS(Java Message Service) 2.0 애플리케이션을 Apache ActiveMQ에서 Azure Service Bus로 마이그레이션

이 문서에서는 JMS Broker와 상호 작용하여 Azure Service Bus와 상호 작용하는 기존 JMS(Java Message Service) 2.0 애플리케이션을 수정하는 방법을 설명합니다. 특히 이 문서에서는 Apache ActiveMQ 또는 Amazon MQ에서 마이그레이션하는 방법에 대해 설명합니다.

Azure Service Bus는 AMQP (Advanced Message Queuing Protocol)를 통해 JMS 2.0 API를 사용하는 Java 2 Platform, Enterprise Edition 및 스프링 워크로드를 지원합니다.

시작하기 전에

Azure Service Bus와 Apache ActiveMQ의 차이

Azure Service Bus와 Apache ActiveMQ는 모두 메시지 브로커이며, 클라이언트 애플리케이션에서 메시지를 보내고 받을 수 있는 JMS 공급자 역할을 합니다. 이러한 두 가지 모두 큐를 사용하여 지점 간 의미 체계를 사용하도록 설정하고, 토픽 및 구독과 함께 게시-구독 의미 체계를 사용하도록 설정합니다.

그럼에도 불구하고 다음 표와 같이 두 가지 차이점이 있습니다.

범주 ActiveMQ Azure Service Bus
애플리케이션 계층화 클러스터형 모놀리스 2계층
(게이트웨이 + 백 엔드)
프로토콜 지원
  • AMQP
  • Stomp
  • OpenWire
AMQP
프로비저닝 모드
  • IaaS(Infrastructure as a Service), 온-프레미스
  • Amazon MQ(서비스로서의 관리형 플랫폼)
서비스형 관리 platform(PaaS)
메시지 크기 고객 구성 가능 100MB\(프리미엄 계층)
고가용성 고객 관리형 플랫폼 관리
재해 복구 고객 관리형 플랫폼 관리

현재 지원되는 기능 및 지원되지 않는 기능

다음 표에서는 Azure Service Bus가 현재 지원하는 JMS(Java Message Service) 기능을 나열합니다. 지원되지 않는 기능도 보여 줍니다.

기능 API 상태
  • JMSContext.createQueue( String queueName)
지원됨
토픽
  • JMSContext.createTopic( String topicName)
지원됨
임시 큐
  • JMSContext.createTemporaryQueue()
지원됨
임시 항목
  • JMSContext.createTemporaryTopic()
지원됨
메시지 생산자 /
JMSProducer
  • JMSContext.createProducer()
지원됨
큐 브라우저
  • JMSContext.createBrowser(큐 큐)
  • JMSContext.createBrowser(큐 큐, String messageSelector)
지원됨
메시지 소비자/
JMSConsumer
  • JMSContext.createConsumer(대상 대상)
  • JMSContext.createConsumer( Destination destination, String messageSelector)
  • JMSContext.createConsumer(Destination 대상, 문자열 messageSelector, 부울 noLocal)

noLocal은 현재 지원되지 않습니다.
지원됨
공유 지속성 구독
  • JMSContext.createSharedDurableConsumer(Topic topic, String name)
  • JMSContext.createSharedDurableConsumer(Topic topic, String name, String messageSelector)
지원됨
공유되지 않는 지속성 구독
  • JMSContext.createDurableConsumer(Topic topic, String name)
  • createDurableConsumer(Topic topic, String name, String messageSelector, boolean noLocal)

noLocal은 현재 지원되지 않으므로 false로 설정해야 합니다.
지원됨
공유되는 비지속형 구독
  • JMSContext.createSharedConsumer(Topic topic, String sharedSubscriptionName)
  • JMSContext.createSharedConsumer(Topic topic, String sharedSubscriptionName, String messageSelector)
지원됨
공유되지 않는 비지속성 구독
  • JMSContext.createConsumer(대상 대상)
  • JMSContext.createConsumer( Destination destination, String messageSelector)
  • JMSContext.createConsumer( Destination destination, String messageSelector, boolean noLocal)

noLocal은 현재 지원되지 않으므로 false로 설정해야 합니다.
지원됨
메시지 선택기 는 만든 소비자에 따라 달라집니다. 지원됨
배달 지연(예약된 메시지)
  • JMSProducer.setDeliveryDelay( long deliveryDelay)
지원됨
생성된 메시지
  • JMSContext.createMessage()
  • JMSContext.createBytesMessage()
  • JMSContext.createMapMessage()
  • JMSContext.createObjectMessage(Serializable 개체)
  • JMSContext.createStreamMessage()
  • JMSContext.createTextMessage()
  • JMSContext.createTextMessage(문자열 텍스트)
지원됨
엔터티 간 트랜잭션
  • 커넥트ion.createSession(true, Session.SESSION_TRANSACTED)
지원됨
분산 트랜잭션 지원되지 않음

고려 사항

Azure Service Bus의 2계층 특성은 다양한 비즈니스 연속성 기능(고가용성 및 재해 복구)을 제공합니다. 그러나 JMS 기능을 사용하는 경우 몇 가지 고려 사항이 있습니다.

서비스 업그레이드

Service Bus 업그레이드 및 다시 시작의 경우 임시 큐 또는 토픽이 삭제됩니다. 애플리케이션이 임시 큐 또는 토픽의 데이터 손실에 민감한 경우 임시 큐 또는 토픽을 사용하지 마세요. 대신 지속성 큐, 토픽 및 구독을 사용합니다.

데이터 마이그레이션

Azure Service Bus와 상호 작용하도록 클라이언트 애플리케이션을 마이그레이션하고 수정하는 과정의 일환으로 ActiveMQ에 저장된 데이터는 Service Bus로 마이그레이션되지 않습니다. ActiveMQ 큐, 토픽 및 구독을 드레이닝한 다음 메시지를 Service Bus의 큐, 토픽 및 구독으로 재생하려면 사용자 지정 애플리케이션이 필요할 수 있습니다.

인증 및 권한 부여

Microsoft Entra ID에서 지원되는 Azure RBAC(Azure 역할 기반 액세스 제어)는 Service Bus에 대한 기본 인증 메커니즘입니다. 역할 기반 액세스 제어를 사용하도록 설정하려면 Azure Service Bus JMS 2.0 개발자 가이드의 단계를 수행하세요.

사전 마이그레이션

버전 검사

JMS 애플리케이션을 작성하는 동안 다음 구성 요소 및 버전을 사용합니다.

구성 요소 버전
JMS(Java Message Service) API 1.1 또는 그 이상
AMQP 프로토콜 1.0

AMQP 포트가 열려 있는지 확인

Service Bus는 AMQP 프로토콜을 통한 통신을 지원합니다. 이러한 목적을 위해 포트 5671 (AMQP) 및 443 (TCP)을 통한 통신을 사용하도록 설정합니다. 클라이언트 애플리케이션이 호스트되는 위치에 따라 이러한 포트를 통한 통신을 허용하려면 지원 티켓이 필요할 수 있습니다.

Important

Service Bus는 AMQP 1.0 프로토콜만 지원합니다.

엔터프라이즈 구성 설정

Service Bus를 사용하면 다양한 엔터프라이즈 보안 및 고가용성 기능을 사용할 수 있습니다. 자세한 내용은 다음을 참조하세요.

모니터링, 경고 및 추적

각 Service Bus 네임 스페이스에 대해 Azure Monitor에 메트릭을 게시합니다. 이러한 메트릭을 사용하여 네임 스페이스에 할당된 리소스의 경고 및 동적 크기 조정을 할 수 있습니다.

다양한 메트릭 및 해당 메트릭에 대한 경고를 설정하는 방법에 대한 자세한 내용은 Azure Monitor의 Service Bus 메트릭을 참조하세요. 또한 데이터 작업에 대한 클라이언트 쪽 추적 및 관리 작업에 대한 운영/진단 로깅에 대해 자세히 알아볼 수 있습니다.

메트릭 - New Relic

ActiveMQ 맵의 메트릭과 Azure Service Bus의 메트릭을 상호 연결할 수 있습니다. New Relic 웹 사이트에서 다음 항목을 참조하세요.

참고 항목

현재 New Relic에는 ActiveMQ와 직접적이고 원활한 통합이 없지만 Amazon MQ에 사용할 수 있는 메트릭이 있습니다. Amazon MQ는 ActiveMQ에서 파생되므로 다음 표는 Amazon MQ에서 Azure Service Bus로 New Relic 메트릭을 매핑합니다.

메트릭 그룹화 Amazon MQ/ActiveMQ 메트릭 Azure Service Bus 메트릭
Broker CpuUtilization CPUXNS
Broker MemoryUsage WSXNS
Broker CurrentConnectionsCount activeConnections
Broker EstablishedConnectionsCount activeConnections + connectionsClosed
Broker InactiveDurableTopicSubscribersCount 구독 메트릭 사용
Broker TotalMessageCount queue/topic/subscription level activeMessages 사용
Queue/Topic EnqueueCount incomingMessages
Queue/Topic DequeueCount outgoingMessages
Queue QueueSize sizeBytes

마이그레이션

Service Bus와 상호 작용하도록 기존 JMS 2.0 애플리케이션을 마이그레이션하려면 다음 몇 섹션의 단계를 수행합니다.

ActiveMQ에서 토폴로지 내보내기 및 Service Bus에서 엔터티 만들기(선택 사항)

클라이언트 애플리케이션이 Service Bus와 원활하게 연결할 수 있도록 하려면 토폴로지(큐, 토픽 및 구독 포함)를 Apache ActiveMQ에서 Service Bus로 마이그레이션합니다.

참고 항목

JMS 애플리케이션의 경우 런타임 작업으로 큐, 토픽 및 구독을 만듭니다. 대부분의 JMS 공급자(메시지 브로커)는 런타임에 이러한 공급자를 만들 수 있는 기능을 제공합니다. 이 내보내기 단계가 선택 사항으로 간주되는 이유입니다. 애플리케이션에 런타임에 토폴로지 만들기 권한이 있는지 확인하려면 SAS Manage 권한으로 연결 문자열 사용합니다.

방법:

  1. ActiveMQ 명령 줄 도구를 사용하여 토폴로지를 내보냅니다.
  2. Azure Resource Manager 템플릿을 사용하여 동일한 토폴로지 다시 만듭니다.
  3. Azure Resource Manager 템플릿을 실행합니다.

Service Bus JMS 구현에 대한 maven 종속성 가져오기

Service Bus와의 원활한 연결을 보장하려면 다음과 같이 패키지를 Maven pom.xml 파일에 종속성으로 추가 azure-servicebus-jms 합니다.

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

애플리케이션 서버 구성 변경

이 파트는 ActiveMQ에 연결하는 클라이언트 애플리케이션을 호스팅하는 애플리케이션 서버에 맞게 사용자 지정됩니다.

Spring 애플리케이션

application.properties 파일을 업데이트합니다.

Spring 부팅 애플리케이션을 사용하여 ActiveMQ에 연결하는 경우 파일에서 application.properties ActiveMQ 관련 속성을 제거하려고 합니다.

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

그런 다음, Service Bus 관련 속성을 파일에 추가합니다 application.properties .

azure.servicebus.connection-string=Endpoint=myEndpoint;SharedAccessKeyName=mySharedAccessKeyName;SharedAccessKey=mySharedAccessKey
ActiveMQConnectionFactoryServiceBusJmsConnectionFactory으로 대체합니다.

다음 단계는 인스턴스를 .로 ActiveMQConnectionFactory 바꾸는 것입니다 ServiceBusJmsConnectionFactory.

참고 항목

실제 코드 변경 내용은 애플리케이션 및 종속성을 관리하는 방법에 따라 달라지지만 다음 샘플에서는 변경해야 하는 사항에 대한 지침을 제공합니다.

이전에는 다음과 같이 ActiveMQConnectionFactory의 개체를 인스턴스화했을 수도 있습니다.


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

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

이제 다음과 같이 개체 ServiceBusJmsConnectionFactory를 인스턴스화하도록 변경합니다.


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();

마이그레이션 후

Service Bus에서 메시지를 보내고 받기 시작하도록 애플리케이션을 수정했으므로 예상대로 작동하는지 확인해야 합니다. 이 작업이 완료되면 애플리케이션 스택을 더 구체화하고 현대화할 수 있습니다.

다음 단계

Service Bus와의 원활한 통합을 위해 Azure Service Bus JMS용 Spring Boot Starter를 사용합니다.

Service Bus 메시징 및 JMS에 대한 자세한 내용은 다음을 참조하세요.