既存の Java Message Service (JMS) 2.0 アプリケーションを Apache ActiveMQ から Azure Service Bus に移行する
この記事では、JMS ブローカーを操作する既存の Java Message Service (JMS) 2.0 アプリケーションを変更して、代わりに Azure Service Bus を操作する方法について説明します。 具体的には、Apache ActiveMQ または Amazon MQ から移行する方法について説明します。
Azure Service Bus では、Advanced Message Queuing Protocol (AMQP) を介して JMS 2.0 API を使用する Java 2 Platform, Enterprise Edition および Spring のワークロードがサポートされています。
開始する前に
Azure Service Bus と Apache ActiveMQ との相違点
Azure Service Bus と Apache ActiveMQ は両方とも、クライアント アプリケーションがメッセージを送受信するための JMS プロバイダーとして機能するメッセージ ブローカーです。 どちらの場合も、キューでのポイントツーポイント セマンティクスと、トピックおよびサブスクリプションでのパブリッシュ/サブスクライブ セマンティクスが有効になります。
それでも、次の表に示すように、両者にはいくつかの違いがあります。
カテゴリ | ActiveMQ | Azure Service Bus |
---|---|---|
アプリケーションの階層化 | クラスター化モノリス | 2 層 (ゲートウェイ + バックエンド) |
プロトコルのサポート |
|
AMQP |
プロビジョニング モード |
|
マネージド PaaS (サービスとしてのプラットフォーム) |
メッセージ サイズ | ユーザーが構成可能 | 100 MB (Premium レベル) |
高可用性 | お客様による管理 | プラットフォーム管理 |
障害復旧 | お客様による管理 | プラットフォーム管理 |
現在サポートされている機能とサポートされていない機能
次の表は、現在 Azure Service Bus でサポートされている Java Message Service (JMS) 機能の一覧を示しています。 また、サポートされていない機能も示しています。
機能 | API | Status |
---|---|---|
キュー |
|
サポートあり |
トピック |
|
サポートあり |
一時キュー |
|
サポートあり |
一時トピック |
|
サポートあり |
メッセージ プロデューサー/ JMSProducer |
|
サポートあり |
キュー ブラウザー |
|
サポートあり |
メッセージ コンシューマー/ JMSConsumer |
noLocal は現在サポートされていません。 |
サポートされています |
共有の永続的サブスクリプション |
|
サポートあり |
非共有の永続的サブスクリプション |
noLocal は現在サポートされていません。False に設定する必要があります |
サポートされています |
共有の非永続的サブスクリプション |
|
サポートあり |
非共有の非永続的サブスクリプション |
noLocal は現在サポートされていません。False に設定する必要があります |
サポートされています |
メッセージ セレクター | 作成されるコンシューマーによって異なります | サポートされています |
配信の遅延 (スケジュール済みメッセージ) |
|
サポートあり |
メッセージの作成 |
|
サポートあり |
エンティティ間トランザクション |
|
サポートあり |
分散トランザクション | サポートなし |
考慮事項
2 層を持つという Azure Service Bus の性質によって、さまざまな事業継続機能 (高可用性とディザスター リカバリー) が提供されます。 ただし、JMS 機能を使用する際には、いくつかの点を考慮する必要があります。
サービスのアップグレード
Service Bus をアップグレードおよび再起動すると、一時キューまたはトピックが削除されます。 アプリケーションが一時キューまたはトピックのデータ損失の影響を受ける場合は、一時キューおよびトピックを使用しないでください。 代わりに、永続キュー、トピック、およびサブスクリプションを使用してください。
データ移行
Azure Service Bus を操作するためのクライアント アプリケーションを移行および変更した場合でも、ActiveMQ に保持されているデータは Service Bus には移行されません。 ActiveMQ のキュー、トピック、およびサブスクリプションをドレインし、メッセージを Service Bus のキュー、トピック、およびサブスクリプションに再生する際に、カスタム アプリケーションが必要になる場合があります。
認証と権限承認
Microsoft Entra ID によってサポートされる Azure ロールベースのアクセス制御 (Azure RBAC) は、Service Bus の推奨される認証メカニズムです。 ロールベースのアクセス制御を有効にするには、Azure Service Bus JMS 2.0 開発者ガイドの手順に従ってください。
移行前
バージョン チェック
JMS アプリケーションの作成時には、次のコンポーネントとバージョンを使用します。
コンポーネント | Version |
---|---|
Java Message Service (JMS) API | 1.1 以上 |
AMQP プロトコル | 1.0 |
AMQP ポートが開いていることを確認する
Service Bus では、AMQP プロトコルを介した通信がサポートされます。 このためには、ポート 5671 (AMQP) と 443 (TCP) を介した通信を有効にします。 クライアント アプリケーションがホストされている場所によっては、これらのポートを介した通信を許可するためのサポート チケットが必要になる場合があります。
重要
Service Bus では、AMQP 1.0 プロトコルのみがサポートされています。
エンタープライズ構成を設定する
Service Bus によって、さまざまなエンタープライズ セキュリティおよび高可用性機能が有効になります。 詳細については、次を参照してください。
監視、アラート、トレース
Service Bus 名前空間ごとに、Azure Monitor にメトリックを発行します。 これらのメトリックを使用して、名前空間に割り当てられたリソースのアラートと動的スケーリングを行うことができます。
さまざまなメトリックの詳細と、それらに対するアラートの設定方法については、「Azure Monitor での Service Bus メトリック」をご覧ください。 また、データ操作のクライアント側のトレースについてはこちらを、管理操作の操作/診断ログについてはこちらをご覧ください。
メトリック - New Relic
ActiveMQ のどのメトリックが Azure Service Bus のどのメトリックにマップされるかを関連付けることができます。 New Relic の Web サイトで以下をご覧ください。
Note
現在、New Relic では ActiveMQ との直接的でシームレスな統合は実現されていませんが、Amazon MQ に使用できるメトリックが用意されています。 Amazon MQ は ActiveMQ から派生しているため、次の表では、AmazonMQ の New Relic メトリックを Azure Service Bus にマップしています。
メトリックのグループ化 | Amazon MQ/ActiveMQ のメトリック | Azure Service Bus のメトリック |
---|---|---|
ブローカー | CpuUtilization |
CPUXNS |
ブローカー | MemoryUsage |
WSXNS |
ブローカー | CurrentConnectionsCount |
activeConnections |
ブローカー | EstablishedConnectionsCount |
activeConnections + connectionsClosed |
ブローカー | InactiveDurableTopicSubscribersCount |
サブスクリプションのメトリックを使用する |
ブローカー | TotalMessageCount |
キュー/トピック/サブスクリプション レベルの activeMessages を使用する |
キュー/トピック | EnqueueCount |
incomingMessages |
キュー/トピック | DequeueCount |
outgoingMessages |
キュー | QueueSize |
sizeBytes |
移行
Service Bus を操作するために既存の JMS 2.0 アプリケーションを移行するには、以降のセクションの手順に従ってください。
ActiveMQ からトポロジをエクスポートして Service Bus でエンティティを作成する (省略可能)
クライアント アプリケーションが Service Bus にシームレスに接続できるようにするには、トポロジ (キュー、トピック、サブスクリプションを含む) を Apache ActiveMQ から Service Bus に移行します。
注意
JMS アプリケーションの場合は、ランタイム操作としてキュー、トピック、およびサブスクリプションを作成します。 ほとんどの JMS プロバイダー (メッセージ ブローカー) には、これらを実行時に作成する機能が用意されています。 そのため、このエクスポート手順は省略可能としています。 アプリケーションが実行時にトポロジを作成する権限を持っていることを確認するには、SAS の Manage
権限を含む接続文字列を使用してください。
これを行うには、次の手順を実行します。
- ActiveMQ コマンド ライン ツール を使用してトポロジをエクスポートします。
- Azure Resource Manager テンプレートを使用して同じトポロジを再作成します。
- 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 Boot アプリケーションを使用して 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
ActiveMQConnectionFactory
を ServiceBusJmsConnectionFactory
に置き換えます。
次の手順では、ActiveMQConnectionFactory
のインスタンスを ServiceBusJmsConnectionFactory
に置き換えます。
Note
実際にコードをどのように変更するかは、アプリケーションと、依存関係の管理方法によって異なります。次のサンプルでは、変更する必要がある内容についてのガイダンスを示します。
以前は、次のように、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 でメッセージの送受信を開始するようにアプリケーションを変更したので、それが想定どおりに動作することを確認する必要があります。 完了したら、アプリケーション スタックをさらに調整し、最新化できます。
次のステップ
Azure Service Bus JMS 用の Spring Boot スターターを使用して、Service Bus とのシームレスな統合を実現します。
Service Bus メッセージングと JMS の詳細については、次をご覧ください。