ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server JMSアプリケーションの開発
12c (12.1.2)
E48081-02
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

3 アプリケーション設計のベスト・プラクティス

この章では、WebLogic Server JMSの設計オプション、設計の過程で考慮すべきアプリケーションの動作、および推奨の設計パターンについて説明します。

メッセージの設計

この節では、メッセージングのパフォーマンスを向上させるメッセージの設計方法について説明します。

アプリケーション・オブジェクトのシリアライズ

Javaオブジェクトのシリアライズを行うと、CPUに非常に大きな負荷がかかるおそれがあります。最終的には、この負荷がJMSオブジェクト・メッセージに影響します。この負荷は、java.io.Externalizableを実装するアプリケーション・オブジェクトを使用することである程度相殺できますが、クラス記述子のマーシャリングにおいては依然として大きなオーバーヘッドになります。Objectメッセージに組み込む追加オブジェクトのクラス記述子を記述する手間を省くには、これらのオブジェクトにExternalizableを実装し、オブジェクト上で直接readExternalおよびwriteExternalを呼び出します。たとえば、stream.writeObject(obj)ではなくobj.writeExternal(stream)を呼び出します。通常、BytesメッセージやStreamメッセージを使用すると、より望ましい結果が得られます。

文字列のシリアライズ

Java文字列のシリアライズは、その他のJavaプリミティブ型のシリアライズよりも大きな負荷がかかります。文字列はメモリーも多用します。1文字につき2バイトのメモリーを消費し、バイナリ・データ(整数など)をコンパクトに表現することもできません。また、文字列ベースのメッセージを使用すると、多くの場合、文字列をアプリケーションで直接使用できる形式に処理するための解析が負荷になります。したがって、Bytesメッセージ、Streamメッセージ、Mapメッセージ、そしてObjectメッセージでさえも、TextメッセージやXMLメッセージよりも望ましい結果になることがあります。同様に、メッセージ・プロパティでは文字列を使用しないことをお薦めします(特にそのサイズが大きい場合)。

サーバー側のシリアライズ

非永続メッセージのシリアライズの負荷は、WebLogic JMSサーバーにはかかりません。非永続メッセージ・タイプのシリアライズは、リモート・クライアントの負荷で実行されます。永続メッセージは、サーバーでシリアライズされます。

選択

セレクタを使用すると大きな負荷になります。この点は、JMSセレクタを使用してアクセスするアプリケーション・データを、メッセージ内のどこに格納するかを決める上で十分に考慮する必要があります。

メッセージの圧縮

JMSアプリケーション内の大きなメッセージを圧縮するとパフォーマンスが向上します。圧縮することで、ネットワーク上でのメッセージの転送に必要な時間が短縮され、JMSサーバーが使用するメモリーの量も減ります。また、永続メッセージの場合は、永続書込みのサイズも小さくなります。多くの場合、TextおよびXMLメッセージはかなり圧縮できます。ただし、圧縮を行うと、当然のことながらクライアントのCPU使用量が増えることになります。

小さいメッセージの場合は、圧縮する利点がない場合もあります。メッセージのサイズが数KB以下の場合、圧縮することで実際のサイズが大きくなることもあります。JDKには、組込みの圧縮ライブラリが用意されています。詳細については、java.util.zipパッケージを参照してください。

指定されたしきい値のサイズを超過したメッセージの自動圧縮をJMS接続ファクトリを使用して指定する方法については、『Oracle WebLogic Serverのパフォーマンスのチューニング』のメッセージの圧縮に関する項を参照してください。

メッセージ・プロパティとメッセージ・ヘッダー・フィールド

ユーザー定義のメッセージ・プロパティのかわりに、標準のJMSメッセージ・ヘッダー・フィールドや、メッセージ・データのメッセージ本文を使用することも検討してください。メッセージ・プロパティは、シリアライズに余分な負荷がかかり、アクセスにおいても標準のJMSメッセージ・ヘッダー・フィールドより大きな負荷がかかります。

また、プロパティ・フィールドやヘッダー・フィールドに大量のデータを組み込むことも避けてください。ページングが有効になっている場合でも、ページングされるのはメッセージの本文のみです。したがって、アプリケーションにユーザー定義のメッセージ・プロパティが定義されている場合は、大きな文字列プロパティを使用しないようにしてください。

詳細については、「メッセージ・ヘッダー・フィールド」および「メッセージ・プロパティ・フィールド」を参照してください。

メッセージの順序

メッセージの処理を厳格に順序付けする場合は、再配信の順序付け機能ではなく、メッセージ順序単位機能を使用することをお薦めします。再配信の順序付けに比べ、メッセージ順序単位には以下の利点があります。

再配信の順序付けを使用しているアプリケーションは、メッセージ順序単位を使用するようにアップグレードすることをお薦めします。詳細については、第10章「メッセージ順序単位の使用」を参照してください。

トピックとキュー

アプリケーションの設計を始めるときには、トピックとキューのどちらを使用したほうがよいかを即座に判断できない場合もあります。一般的には、以下の条件のいずれかが満たされる場合にのみトピックを選択します。

恒久サブスクライバが1つのみのトピックは、セマンティクスの面ではキューに似ています。相違点は以下のとおりです。

JMSキューとトピックの構成の詳細は、『Oracle WebLogic Server JMSリソースの管理』のキューおよびトピック宛先のリソースに関する項を参照してください。

非同期コンシューマと同期コンシューマ

一般的に、非同期(onMessage)コンシューマは、パフォーマンスとスケーラビリティの面で同期コンシューマより優れています。

詳細については、「メッセージの非同期受信」および「メッセージの同期受信」を参照してください。

永続メッセージと非永続メッセージ

アプリケーションを設計する際は、永続QOSが必要な場合を除いて、メッセージが非永続モードで送信されるように指定してください。非永続モードをお薦めする理由は、同期書込みが無効になっていない限り、永続QOSが原因でパフォーマンスがかなり悪化する場合が多いためです。


注意:

メッセージが誤って永続化されないよう十分に注意してください。設計者がメッセージを非永続モードで送信するつもりで設計しても、アプリケーションが永続メッセージを送信することがあります。


メッセージが本当に非永続であれば、通常のJMSストアには格納されません。誤って永続化されたメッセージがないことを確認するには、消費されていないメッセージがJMSサーバーに蓄積されているときに、JMSストアのサイズが大きくなっているかどうかをチェックします。以下に、メッセージの永続性を決定する条件を優先度の高い順に示します。

恒久サブスクライバが非永続メッセージしか受信しない場合でも、そのJMSサーバーには永続ストアを構成する必要があります。恒久サブスクリプションは、JMS仕様の要件に従って、サーバーの再起動後も継続するように永続化されます。

確認応答とコミットの延期

通常は送信よりも受信のほうに時間がかかるため、複数のメッセージを受信してまとめて確認応答できるようになるまで確認応答を延期して、受信に関わるオーバーヘッドを軽減することを検討してください。トランザクションを使用している場合は、「確認応答」を「コミット」と読み替えてください。

ただし、非恒久サブスクリプションの場合はすでに内部的に最適化されているため、確認応答を延期してもパフォーマンスはあまり向上しません。

非同期リスナーには、確認応答の延期を実装できない場合があります。メッセージ10個ごとに確認応答する非同期リスナーが5個のメッセージしか受信しなかった場合、最後のいくつかのメッセージが確認応答されない可能性があります。考えられる解決策としては、onMessage()コールバック内からの同期非ブロッキング受信を非同期コンシューマにポストさせて、後続のメッセージを受信します。別の解決策としては、wake upリスナーがトリガーされたときに、リスナーの宛先にメッセージを送信するタイマーが開始されるようにします。このメッセージが正しいリスナーに確実に転送されれば、リスナーの宛先が起動してまだ確認応答されていない未処理の作業を完了します。

非恒久サブスクライバでのAUTO_ACKの使用

トランザクション非対応の非恒久トピック・サブスクライバがメッセージのローカル・コピーをクライアント側で格納するように最適化されており、これによって確認応答の発行に伴うネットワーク・オーバーヘッドを軽減しています。この最適化によってパフォーマンスが10 - 20%向上します。パフォーマンスの向上は、サブスクライバの負荷が大きいほどより顕著になります。

この最適化の副作用の1つは、特に数多くのトピック・サブスクライバが同時に存在する場合に、クライアント側でのガベージ・コレクションのオーバーヘッドが大きくなり、メッセージ・サブスクリプションのパフォーマンスが悪化するおそれがあることです。このような悪化を防ぐため、サブスクライバ・クライアントのヒープ・サイズを大きくすることをお薦めします。たとえば、10個のJVMで100個のサブスクライバを同時に存在させるテストでは、各JVMのヒープ・サイズの初期値と最大値を64 MBに設定すれば十分でした。

代替のサービス品質、マルチキャスト、NO_ACKNOWLEDGE

WebLogic JMSでは、パフォーマンスを改善できる代替のサービス品質(QOS)拡張が提供されています。

MULTICAST_NO_ACKNOWLEDGEの使用

非恒久トピック・サブスクライバは、MULTICAST_NO_ACKNOWLEDGEを使用してメッセージをサブスクライブできます。トピックにこのようなサブスクライバがある場合、JMSサーバーはマルチキャスト・モードを使用してこれらのサブスクライバにメッセージをブロードキャストします。マルチキャストでは、サブスクライバごとに1つずつメッセージを処理するのではなく、サブスクライバがいくつあってもネットワークで1つのメッセージを処理するだけでよいため、パフォーマンスが格段に向上し、直線的なスケーラビリティが提供されます。ネットワークが混み合っている場合や、クライアントによるメッセージ処理が遅れている場合は、マルチキャスト・メッセージが消失するおそれがあります。マルチキャスト・メッセージでrecover()acknowledge()を呼び出しても効果はありません。


注意:

クライアント側では、マルチキャスト・セッションごとに、マルチキャスト・ソケットからメッセージを取り出すための専用のスレッドが1つ必要になります。そのため、JMSクライアント側のスレッド・プール・サイズを増やして調整する必要があります。


このQOS拡張による保証は、非恒久トピック・サブスクリプション用にOracle WebLogic Server以外のベンダーから提供されている一部のJMS実装のデフォルトQOSによる保証と同じレベルです。JMS 1.1仕様では、サブスクライバの準備が整っていない場合に非恒久トピック・メッセージを破棄(削除)することが明確に許可されています。WebLogic JMSでは、非恒久トピック・サブスクリプション用に、JMS 1.1仕様で必須とされているレベルよりも高いレベルのQOSがデフォルトで提供されます。

NO_ACKNOWLEDGEの使用

NO_ACKNOWLEDGE配信モードでは、サーバーからコンシューマにメッセージが送信されますが、確認応答は呼び出されません。かわりに、サーバーはメッセージを事前に確認応答します。この確認応答モードでは、メッセージがすでに確認応答されているため、リカバリを呼び出しても機能しません。このモードを使用すると、確認応答のための追加のネットワーク呼出しによるオーバーヘッドは軽減されますが、サーバー、ネットワーク、またはクライアントで障害が発生した場合にメッセージが消失するおそれがあります。


注意:

このような状況で非同期クライアントがclose()を呼び出すと、非同期パイプライン内のすべてのメッセージが消失します。


NO_ACKNOWLEDGE QOSを使用する非同期コンシューマでは、クラッシュ時に消失するメッセージの数を抑えるために、メッセージ・パイプラインのサイズを小さくすることも検討してください。

マルチスレッド化の回避

JMS仕様(http://www.oracle.com/technetwork/java/jms/index.html)では、close()を呼び出したときを除き、セッション、プロデューサ、コンシューマ、またはメッセージ・メソッドをマルチスレッド化すると動作が不安定になるとされています。このリリースのWebLogic JMSでは、マルチスレッド化されたプロデューサを作成すると、サーバー・インスタンスからJMSExceptionがスローされます。アプリケーションのスレッドが制限されている場合は、プロデューサおよびセッションの数を増やすことを検討してください。

JMSXUserIDプロパティの使用

WebLogic Server 9.0以降では、メッセージ・センダーの認証されたユーザー名が自動的に伝播されるようにJMS接続ファクトリまたは宛先を構成できます。ユーザー名は、JMSXUserIDというjavax.jms.Messageプロパティに配置されます。

アプリケーションでJMSXUserIDプロパティを使用する場合は、次の点に注意してください。

接続ファクトリまたは宛先のJMSXUserIDプロパティの設定手順については、管理コンソール・オンライン・ヘルプの以下のトピックを参照してください。

パフォーマンスとチューニング

アプリケーションを最大限に活用する方法については、『Oracle WebLogic Serverのパフォーマンスのチューニング』のWebLogic JMSのチューニングに関する項のWebLogic JMSで利用できるパフォーマンス・チューニング機能を実装します。