MDBを使用した並行戦略

MDBを使用した並行戦略

1. 前書き

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

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

Javaを使用した並行性の基本について詳しく知りたい場合は、hereを開始できます。

MDBと同時実行性をより適切に使用するには、いくつかの考慮事項があります。 It’s important to keep in mind that those considerations should be driven by the business rules and the needs of our application.

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

スレッドプールのチューニングは、おそらく主な注意点です。 並行性をうまく利用するには、tune the number of MDB instances available to consume messagesが必要です。 1つのインスタンスがメッセージの処理でビジーな場合、他のインスタンスは次のインスタンスを取得できます。

MessageListenerスレッドは、MDBのonMessageメソッドを実行する責任があります。 このスレッドはMessageListenerスレッドプールの一部です。つまり、プールされ、何度も再利用されます。 This pool also has a configuration that allows us to set the number of threads, which may impact the performance:

  • 小さなプールサイズを設定すると、メッセージの消費が遅くなります(「MDBスロットル」)

  • 非常に大きなプールサイズを設定すると、パフォーマンスが低下する可能性があります。まったく機能しない場合もあります。

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

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

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

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

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

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

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

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


    
        maxSession
        50
    

4. 展開環境

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

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

  • all servers in the cluster eligible to receive messagesを作成します。これにより、すべての処理能力を使用できます。または

  • sequential manner by allowing just one server to receivethem at a timeでのメッセージ処理を確認してください

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

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

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

メッセージタイプにXMLを選択する場合、たとえば、the size of the message can affect the time spent to process it。 これは、特にアプリケーションが多数のメッセージを処理する場合に重要な考慮事項です。

メッセージモデルに関しては、if the application needs to send the same message to a lot of consumers, a publish-subscribe model might be the right choice。 これにより、メッセージ処理のオーバーヘッドが削減され、パフォーマンスが向上します。

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

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

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


    
        destinationType
        javax.jms.Topic
    

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

キューから消費するには、注釈を次のように設定します。

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

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


    
        destinationType
        javax.jms.Queue
    

6. 結論

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

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