パフォーマンスを向上させるための JMS Connector のチューニング

メッセージによりパフォーマンスに悪影響が及ぶことがあります。次の推奨事項は、Mule アプリケーションで JMS 用 Anypoint Connector (JMS Connector) を最大限活用するのに役立つ可能性があります。

接続キャッシュの再利用

接続の作成には多くのリソースが使用されるため、接続はできる限り再利用します。デフォルトでは、JMS Connector では、できる限り多くのコンシューマーとプロデューサーを再利用するキャッシュ戦略が使用されます。パフォーマンスの低下を避けるため、接続キャッシュは無効にしないでください。

同時メッセージ処理数の増大

アプリケーションのパフォーマンスを高めるには、同じ宛先からのメッセージを受信するコンシューマーの数を増やします。JMS Connector では、​On New Message​ ソースの ​[Number of consumers (コンシューマー数)]​ 項目を設定することでコンシューマー数を増やすことができます。デフォルトでは、このソースでは、4 つのコンシューマーが同じ宛先のメッセージを同時に受信できますが、この数をニーズに最も適した数に増やすことができます。

次の例では、メッセージを同時に受信するコンシューマーの数を増やします。

  1. Studio で、フローから ​[On New Message]​ ソースを選択します。

  2. On New Message​ ソースの設定画面で、​[Number of consumers (コンシューマー数)]​ 項目を ​20​ に設定します。

「On New Message」 設定画面で、「Number of consumers (コンシューマー数)」 項目を 20 に設定する
Figure 1. JMS Connector のコンシューマー数の設定

XML エディターでは、​numberOfConsumers​ 設定は次のように記述されます。

<jms:listener config-ref="config" destination="#[vars.destination]" numberOfConsumers="20"/>
xml

クラスター設定の最適化

クラスターで動作するアプリケーションの場合は、プライマリノードとコネクタの動作を考慮します。アプリケーションがクラスターで動作する場合、​On New Message​ ソースのデフォルトの動作では、どのような種類の宛先をアプリケーションでコンシュームする場合でも、プライマリノードでのみメッセージを受信します。

キューからメッセージをコンシュームする場合、デフォルトのコネクタ動作では、プライマリノードだけではなく、クラスターのすべてのノードでメッセージを受信します。JMS Connector では、​On New Message​ ソースの ​[Primary node only (プライマリノードのみ)]​ 項目を設定できます。コネクタでクラスター内のキューからメッセージをコンシュームする場合、​[Primary node only (プライマリノードのみ)]​ 項目を選択しないでください。これはデフォルトで ​false​ になります。

次の例では、すべてのノードでメッセージを受信するようにコネクタを設定します。

  1. Studio で、フローから ​[On New Message]​ ソースを選択します。

  2. [Advanced (詳細)]​ タブで ​[Primary node only (プライマリノードのみ)]​ 項目を選択解除したままにします。

On New Message ソースの [Advanced (詳細)] タブの [Primary node only (プライマリノードのみ)] 項目をオフにする
Figure 2. JMS Connector のプライマリノードのみの設定

XML エディターでは、​primaryNodeOnly​ 設定は次のように記述されます。

<jms:listener config-ref="config" destination="${inputQueue}" primaryNodeOnly="false"/>
xml

トピックからメッセージをコンシュームする場合、デフォルトのコネクタ動作では、プライマリノードでのみメッセージを受信するため、クラスター間で同じメッセージを複数回処理することが回避されます。

クラスター内のトピックからメッセージをコンシュームする場合、​[Primary node only (プライマリノードのみ)]​ の設定をオフにすると、共有サブスクリプションも設定していない限りクラスターで同じメッセージが複数回処理されます。
JMS 2.0 共有サブスクリプションメカニズムを使用していて、すべてのノードからメッセージをコンシュームするようにクラスター設定を変更する場合、同じように ​[Primary node only (プライマリノードのみ)]​ 項目を ​false​ に設定します。

次の例では、2.0 仕様の共有サブスクリプションメカニズムを使用してコネクタを設定します。

  1. Studio で、フローから ​[On New Message]​ ソースを選択します。

  2. On New Message​ ソースの設定画面で、​[Topic consumer (トピックコンシューマー)]​ を選択します。

  3. [Shared (共有)]​ オプションを選択します。

  4. [Subscription name (サブスクリプション名)]​ を ​clusteredEventListener​ に設定します。

  5. [Advanced (詳細)]​ タブで ​[Primary node only (プライマリノードのみ)]​ 項目を選択解除したままにします。

On New Message ソースの [Advanced (詳細)] タブの [Primary node only (プライマリノードのみ)] 項目をオフにする
Figure 3. JMS Connector のプライマリノードのみの設定

XML エディターでは、​jms:topic-consumer​、​shared​、および ​primaryNodeOnly​ の設定は次のように記述されます。

<jms:listener config-ref="JMS_20_config" destination="${inputTopic}" primaryNodeOnly="false">
     <jms:consumer-type>
         <jms:topic-consumer shared="true" subscriptionName="clusteredEventListener"/>
     </jms:consumer-type>
 </jms:listener>
xml

JMS Connector のプリフェッチの設定

JMS Connector では、ActiveMQ クライアントを使用する場合、サーバー接続 URL に対してプリフェッチを設定します。詳細は、 ActiveMQ のドキュメントLeaving the Site​を参照してください。

たとえば、​jms.prefetchPolicy.all​ パラメーターを含む次の接続 URL について考えてみます。

tcp://localhost:61616?jms.prefetchPolicy.all=50
tcp://localhost:61616?jms.prefetchPolicy.queuePrefetch=1
xml

JMS Connector XML 設定では、接続 ​brokenUrl​ の設定は次のようになります。

<jms:config name="JMS_Config_listen" doc:name="JMS Config" doc:id="6600826c-0798-496b-b016-9b9b29268cb8" >
		<jms:active-mq-connection username="admin" password="admin" >
				<reconnection >
				<reconnect-forever />
			</reconnection>
			<jms:caching-strategy >
				<jms:no-caching />
			</jms:caching-strategy>
			<jms:factory-configuration brokerUrl="tcp://localhost:61616?jms.prefetchPolicy.all=1" enable-xa="true" />
		</jms:active-mq-connection>
		<expiration-policy maxIdleTime="30" timeUnit="SECONDS" />
		<jms:consumer-config />
		<jms:producer-config persistentDelivery="true" />
	</jms:config>
xml

大量のメッセージがあり高パフォーマンスが要求される場合、プリフェッチ値を増加します。ただし、メッセージ量が少なく、各メッセージの処理時間が長い場合は、プリフェッチを ​1​ に設定します。これにより、コンシューマーでは一度に 1 つのメッセージのみが処理されます。ただし、ゼロのプリフェッチ制限を指定すると、メッセージがコンシューマーにプッシュされるのではなくコンシューマーでメッセージが 1 つずつポーリングされます。