1. 序章

「MDB」とも呼ばれるメッセージ駆動型Beanは、非同期コンテキストでメッセージ処理を処理します。 MDBの基本はこの記事で学ぶことができます。

このチュートリアルでは、メッセージ駆動型Beanを使用して同時実行を実装するためのいくつかの戦略とベストプラクティスについて説明します。

Javaを使用した並行性の基本について詳しく知りたい場合は、ここから始めることができます。

MDBと同時実行性をより適切に使用するために、いくつかの考慮事項があります。 これらの考慮事項は、ビジネスルールとアプリケーションのニーズに基づいて決定する必要があることを覚えておくことが重要です。

2. スレッドプールの調整

スレッドプールの調整は、おそらく主な注意点です。 同時実行性をうまく利用するには、メッセージを消費するために使用可能なMDBインスタンスの数を調整する必要があります。 1つのインスタンスがメッセージの処理でビジー状態の場合、他のインスタンスは次のインスタンスを取得できます。

MessageListener スレッドは、MDBのonMessageメソッドを実行する役割を果たします。 このスレッドはMessageListenerスレッドプールの一部です。つまり、プールされ、何度も再利用されます。 このプールには、パフォーマンスに影響を与える可能性のあるスレッド数を設定できる構成もあります。

  • プールサイズを小さく設定すると、メッセージの消費が遅くなります(「MDBスロットリング」)
  • 非常に大きなプールサイズを設定すると、パフォーマンスが低下する可能性があります。または、まったく機能しない場合もあります。

Wildfly では、管理コンソールにアクセスしてこの値を設定できます。 デフォルトのスタンドアロンプロファイルでは、JMS機能が有効になっていません。 フルプロファイルを使用してサーバーを起動する必要があります。

通常、ローカルインストールでは、http://127.0.0.1:9990 / console/index.htmlからアクセスします。 その後、構成/サブシステム/メッセージング/サーバーにアクセスし、サーバーを選択して「表示」をクリックする必要があります。

「属性」タブを選択し、「編集」をクリックして、「スレッドプールの最大サイズ」の値を変更します。 デフォルト値は30です。

3. 最大セッションの調整

注意すべきもう1つの構成可能なプロパティは、 MaximumSessionsです。 これは、特定のリスナーポートの同時実行性を定義します。 通常、これはデフォルトで1に設定されていますが、これを増やすと、MDBアプリケーションのスケーラビリティと可用性が向上します。

アノテーションまたは.xml記述子のいずれかで構成できます。 注釈を通じて、@ActivationConfigPropertyを使用します。

@MessageDriven(activationConfig = {
    @ActivationConfigProperty(
        propertyName=”maxSession”, propertyValue=”50”
    )
})

選択した構成方法が.xml記述子の場合、maxSessionを次のように構成できます。

<activation-config>
    <activation-config-property>
        <activation-config-property-name>maxSession</activation-config-property-name>
        <activation-config-property-value>50</activation-config-property-value>
    </activation-config-property>
</activation-config>

4. 展開環境

高可用性が必要な場合は、アプリケーションサーバークラスターにMDBをデプロイすることを検討する必要があります。 したがって、クラスター内の任意のサーバーで実行でき、多くのアプリケーションサーバーが同時に呼び出すことができるため、スケーラビリティも向上します。

この特定のケースでは、次の重要な選択があります。

  • クラスター内のすべてのサーバーがメッセージを受信できるようにする。これにより、すべての処理能力を使用できるようになります。
  • 1台のサーバーだけが一度にメッセージを受信できるようにすることで、シーケンシャルな方法でメッセージ処理を確実にします

エンタープライズバスを使用する場合は、MDBをバスメンバーと同じサーバーまたはクラスターに展開して、メッセージングのパフォーマンスを最適化することをお勧めします。

5. メッセージモデルとメッセージタイプ

これは、プールに別の値を設定するほど明確ではありませんが、メッセージモデルとメッセージタイプは、同時実行を使用する最大の利点の1つであるパフォーマンスに影響を与える可能性があります。

たとえば、メッセージタイプにXMLを選択する場合、メッセージのサイズは、メッセージの処理にかかる時間に影響を与える可能性があります。 これは、アプリケーションが多数のメッセージを処理する場合は特に重要な考慮事項です。

メッセージモデルに関しては、アプリケーションが同じメッセージを多くのコンシューマーに送信する必要がある場合、パブリッシュ/サブスクライブモデルが正しい選択である可能性があります。 これにより、メッセージ処理のオーバーヘッドが削減され、パフォーマンスが向上します。

パブリッシュ/サブスクライブモデルのトピックから消費するには、アノテーションを使用できます。

@ActivationConfigProperty(
  propertyName = "destinationType", 
  propertyValue = "javax.jms.Topic")

ここでも、.xmlデプロイメント記述子でこれらの値を構成することもできます。

<activation-config>
    <activation-config-property>
        <activation-config-property-name>destinationType</activation-config-property-name>
        <activation-config-property-value>javax.jms.Topic</activation-config-property-value>
    </activation-config-property>
</activation-config>

まったく同じメッセージを多くのコンシューマーに送信する必要がない場合は、通常のPTP(ポイントツーポイント)モデルで十分です。

キューから消費するには、アノテーションを次のように設定します。

@ActivationConfigProperty(
  propertyName = "destinationType", 
  propertyValue = "javax.jms.Queue")

.xml デプロイメント記述子を使用している場合は、次のように設定できます。

<activation-config>
    <activation-config-property>
        <activation-config-property-name>destinationType</activation-config-property-name>
        <activation-config-property-value>javax.jms.Queue</activation-config-property-value>
    </activation-config-property>
</activation-config>

6. 結論

多くのコンピューター科学者やITライターがすでに述べているように、プロセッサーの速度が速いペースで向上することはもはやありません。 プログラムをより高速に動作させるには、現在利用可能なより多くのプロセッサとコアを使用する必要があります。

この記事では、MDBを使用して同時実行性を最大限に活用するためのいくつかのベストプラクティスについて説明しました。