Amazon MQ for ActiveMQ のベストプラクティス - Amazon MQ

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Amazon MQ for ActiveMQ のベストプラクティス

このセクションは、Amazon MQ での ActiveMQ ブローカーの使用時にパフォーマンスを最大限に引き出し、スループットコストを最小限に抑えるための推奨事項をすばやく見つけるために使用してください。

Amazon MQ Elastic Network Interface を変更または削除しない

Amazon MQ ブローカー を初めて作成すると、Amazon MQ はアカウントの Virtual Private Cloud (VPC)Elastic Network Interface をプロビジョニングするため、多数のEC2アクセス許可 が必要です。このネットワークインターフェイスは、クライアント (プロデューサーまたはコンシューマー) が Amazon MQ ブローカーと通信することを可能にします。ネットワークインターフェイスは、アカウントの の一部であるにもかかわらず、Amazon MQ のサービス範囲内であると見なされますVPC。

警告

このネットワークインターフェイスを変更または削除しないでください。ネットワークインターフェイスを変更または削除すると、 VPCとブローカー間の接続が永続的に失われる可能性があります。

Diagram showing Client, Elastic Network Interface, and Amazon MQ Broker within a Customer VPC and service scope.

常に接続プールを使用する

単一のプロデューサーと単一のコンシューマーを使用するシナリオ (開始方法: ActiveMQ ブローカーの作成と接続チュートリアルなど) では、各プロデューサーおよびコンシューマーに単一の ActiveMQConnectionFactory クラスを使用できます。以下はその例です。

// Create a connection factory. final ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(wireLevelEndpoint); // Pass the sign-in credentials. connectionFactory.setUserName(activeMqUsername); connectionFactory.setPassword(activeMqPassword); // Establish a connection for the consumer. final Connection consumerConnection = connectionFactory.createConnection(); consumerConnection.start();

ただし、複数のプロデューサーやコンシューマーが関与するより現実的なシナリオでは、複数のプロデューサーのために多数の接続を作成することはコスト高および非効率的になる場合があります。このようなシナリオでは、PooledConnectionFactory クラスを使用して複数のプロデューサーリクエストをグループ化する必要があります。以下はその例です。

注記

メッセージコンシューマーには、PooledConnectionFactory クラスを一切使用しないでください。

// Create a connection factory. final ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(wireLevelEndpoint); // Pass the sign-in credentials. connectionFactory.setUserName(activeMqUsername); connectionFactory.setPassword(activeMqPassword); // Create a pooled connection factory. final PooledConnectionFactory pooledConnectionFactory = new PooledConnectionFactory(); pooledConnectionFactory.setConnectionFactory(connectionFactory); pooledConnectionFactory.setMaxConnections(10); // Establish a connection for the producer. final Connection producerConnection = pooledConnectionFactory.createConnection(); producerConnection.start();

常にフェイルオーバートランスポートを使用して複数のブローカーエンドポイントに接続する

アクティブ/スタンバイデプロイモードを使用するとき、またはオンプレミスメッセージブローカーから Amazon MQ に移行するときなど、アプリケーションを複数のブローカーエンドポイントに接続する必要がある場合は、フェイルオーバートランスポートを使用して、コンシューマーがそれらのいずれかにランダムに接続できるようにします。以下はその例です。

failover:(ssl://b-1234a5b6-78cd-901e-2fgh-3i45j6k178l9-1.mq.us-east-2.amazonaws.com:61617,ssl://b-9876l5k4-32ji-109h-8gfe-7d65c4b132a1-2.mq.us-east-2.amazonaws.com:61617)?randomize=true

メッセージセレクタを使用しない

JMS セレクターを使用して、トピックサブスクリプションにフィルターをアタッチできます (コンテンツに基づいてコンシューマーにメッセージをルーティングします)。ただし、JMSセレクタを使用すると、Amazon MQ ブローカーのフィルターバッファがいっぱいになり、メッセージのフィルタリングができなくなります。

一般的に、コンシューマーによるメッセージのルーティングは避けます。コンシューマーとプロデューサーが適切に非干渉化されるために、コンシューマーとプロデューサーはどちらもエフェメラルである必要があるためです。

永続サブスクリプションよりも仮想送信先を優先する

たとえば接続が失われて復元された後などに、トピックに発行されたすべてのメッセージをコンシューマーが受信するには、永続サブスクリプションが役立ちます。ただし、永続サブスクリプションを使用する場合、競合するコンシューマーの使用は不可能であり、パフォーマンスの大規模な問題が発生する可能性があります。代わりに、仮想送信先を使用することを検討してください。

Amazon VPCピアリングを使用している場合は、CIDR範囲内IPsのクライアントは避けてください。 10.0.0.0/16

オンプレミスインフラストラクチャと Amazon MQ ブローカー間の Amazon VPCピアリングを設定する場合は、 CIDR の範囲IPsに を使用してクライアント接続を設定しないでください10.0.0.0/16

低速コンシューマーのキューに対して同時保存とディスパッチを無効にする

デフォルトで、Amazon MQ は高速コンシューマーのキューに対して最適化を行います。

  • コンシューマーは、プロデューサーによって生成されるメッセージの速度に対応できる場合、高速とみなされます。

  • キューによって未確認メッセージのバックログが生成され、プロデューサーのスループットが低下する可能性がある場合、コンシューマーは低速とみなされます。

低速コンシューマーのキューに対して最適化を行うよう Amazon MQ に指示するには、concurrentStoreAndDispatchQueues 属性を false に設定します。設定の例については、「concurrentStoreAndDispatchQueues」を参照してください。

最良なスループットのために正しいブローカーインスタンスタイプを選択する

ブローカーインスタンスタイプのメッセージスループットは、アプリケーションのユースケースおよび以下の要因に依存します。

  • ActiveMQ を永続モードで使用する

  • メッセージサイズ

  • プロデューサーとコンシューマーの数

  • 送信先の数

メッセージサイズ、レイテンシー、およびスループット間の関係の理解

ユースケースによっては、より大きなブローカーインスタンスタイプはシステムスループットを向上させない場合があります。ActiveMQ が耐久性のあるストレージにメッセージを書き込むと、メッセージのサイズはシステムの制限要因を決定します。

  • メッセージが 100 KB 未満の場合、永続的ストレージのレイテンシーが制限要因となります。

  • メッセージが 100 KB 以上の場合、永続的ストレージのスループットが制限要因となります。

ActiveMQ を永続モード使用すると、ストレージへの書き込みは通常、前のコンシューマーがいくつか存在するか、あるいはコンシューマーが低速の場合に発生します。非永続的なモードでは、ブローカーインスタンスのヒープメモリに空き容量がない場合にも、低速のコンシューマーによるストレージへの書き込みが発生します。

アプリケーションにおける最適なブローカーインスタンスタイプを決定するには、異なるブローカーインスタンスタイプをテストすることが推奨されます。詳細については、Broker instance types「」および「ベンチマーク を使用した Amazon MQ のスループットの測定」を参照してください。 Amazon MQ JMS

より大きなブローカーインスタンスタイプのユースケース

より大きなブローカーインスタンスタイプがスループットを向上させるには、3 つの一般的なユースケースがあります。

  • 非永続モード – アプリケーションがブローカーインスタンスのフェイルオーバー中におけるメッセージの喪失による影響を受けにくいときは、多くの場合 ActiveMQ の非永続モードを使用できます。このモードでは、ブローカーインスタンスのヒープメモリに空き容量がない場合にのみ、ActiveMQ は永続的ストレージにメッセージを書き込みます。非永続モードを使用するシステムは、より大きなブローカーインスタンスタイプで使用できる大量のメモリ、高速な CPU、高速なネットワークからメリットを得ることができます。

  • 高速コンシューマー – アクティブなコンシューマーが利用可能で、concurrentStoreAndDispatchQueues フラグが有効になっていると、ActiveMQ は、永続モードになっている場合でも、ストレージにメッセージを送信することなく、プロデューサーからコンシューマーへの直接的なメッセージのフローを許可します。アプリケーションが素早くメッセージを消費できる場合 (あるいは、コンシューマーがその処理を行えるように設計できる場合)、アプリケーションはより大きなブローカーインスタンスタイプの利点を活用できます。アプリケーションがより素早くメッセージを消費できるようにするには、アプリケーションインスタンスにコンシューマースレッドを追加するか、あるいはアプリケーションインスタンスを水平あるいは垂直にスケールアップします。

  • バッチトランザクション – 永続的モードを使用しており、トランザクションごとに複数のメッセージを送信するときは、より大きなブローカーインスタンスタイプを使用することによって、全体的に高いメッセージスループットを達成することができます。詳細については、ActiveMQ ドキュメントの「Should I Use Transactions?」を参照してください。

最高のスループットのために正しいブローカーストレージタイプを選択する

複数のアベイラビリティーゾーンで高い耐久性とレプリケーションを活用するには、Amazon を使用しますEFS。低レイテンシーと高スループットを活用するには、Amazon を使用しますEBS。詳細については、「Storage」を参照してください。

ブローカーのネットワークを正しく設定する

ブローカーのネットワークを作成するときは、アプリケーションに合わせて正しく設定します。

  • 永続モードを有効にする – 同等のものと比べると、各ブローカーインスタンスはプロデューサーまたはコンシューマーのように動作するため、ブローカーのネットワークはメッセージの分散レプリケーションを提供しません。コンシューマーとして機能する最初のブローカーはメッセージを受信し、それをストレージに永続化します。このブローカーは確認をプロデューサーに送信し、そのメッセージを次のブローカーに転送します。2 番目のブローカーがメッセージの持続性を確認すると、最初のブローカーはそのメッセージを削除します。

    永続モードが無効になっている場合、最初のブローカーはメッセージをストレージに保持せずにプロデューサーに確認します。詳細については、Apache ActiveMQ ドキュメントの「レプリケートされたメッセージストア」および「永続的配信と非永続的配信の違い」を参照してください。

  • ブローカーインスタンスのアドバイザリーメッセージを無効にしない – 詳細については、Apache ActiveMQ ドキュメントの「Advisory Message」を参照してください。

  • マルチキャストブローカー検出を使用しない – Amazon MQ はマルチキャストを使用したブローカー検出をサポートしません。詳細については、Apache ActiveMQ ドキュメントの「検出、マルチキャスト、および zeroconf の違い」を参照してください。

準備された XA トランザクションを復旧することで再起動が遅くならないようにする

ActiveMQ は分散型 (XA) トランザクションをサポートしています。ActiveMQ が XA トランザクションを処理する方法を理解しておくと、Amazon MQ でのブローカーの再起動とフェイルオーバーにかかる長い復旧時間の回避に役立ちます。

未解決の準備済み XA トランザクションは、再起動のたびに再実行されます。これらのトランザクションが未解決のままである場合、その数は時間の経過とともに大きくなり、ブローカーの起動に必要な時間が大幅に長くなります。これにより、再起動とフェイルオーバー時間に影響があります。commit() および rollback() を使用してこれらのトランザクションを解決し、時間の経過とともにパフォーマンスが低下しないようにする必要があります。

未解決の準備済み XA トランザクションをモニタリングするには、Amazon CloudWatch Logs で JournalFilesForFastRecoveryメトリクスを使用できます。この数値が増えるか、常に 1 より高い場合は、次の例のようなコードを使用して、未解決のトランザクションを復旧します。詳細については、「Quotas in Amazon MQ」を参照してください。

以下のコード例は、準備された XA トランザクションを確認し、rollback() でそれらを終了します。

import org.apache.activemq.ActiveMQXAConnectionFactory; import javax.jms.XAConnection; import javax.jms.XASession; import javax.transaction.xa.XAResource; import javax.transaction.xa.Xid; public class RecoverXaTransactions { private static final ActiveMQXAConnectionFactory ACTIVE_MQ_CONNECTION_FACTORY; final static String WIRE_LEVEL_ENDPOINT = "tcp://localhost:61616";; static { final String activeMqUsername = "MyUsername123"; final String activeMqPassword = "MyPassword456"; ACTIVE_MQ_CONNECTION_FACTORY = new ActiveMQXAConnectionFactory(activeMqUsername, activeMqPassword, WIRE_LEVEL_ENDPOINT); ACTIVE_MQ_CONNECTION_FACTORY.setUserName(activeMqUsername); ACTIVE_MQ_CONNECTION_FACTORY.setPassword(activeMqPassword); } public static void main(String[] args) { try { final XAConnection connection = ACTIVE_MQ_CONNECTION_FACTORY.createXAConnection(); XASession xaSession = connection.createXASession(); XAResource xaRes = xaSession.getXAResource(); for (Xid id : xaRes.recover(XAResource.TMENDRSCAN)) { xaRes.rollback(id); } connection.close(); } catch (Exception e) { } } }

実際のシナリオでは、XA トランザクションマネージャーに対して準備済み XA トランザクションを確認することができます。その後、rollback() または commit() を使用して準備されたトランザクションのそれぞれを処理するかどうかを決定できます。