9.3.5. TcpDelegatingCacheLoader
このキャッシュローダーはロードと保存を JBossCache の別のインスタンスに委譲します。 このインスタンスは、 同じアドレス空間、 同じホストの別プロセス、別ホストの別プロセスのいずれかに存在できます。
TcpDelegatingCacheLoader はリモートの
org.jboss.cache.loader.tcp.TcpCacheServer と対話します。 org.jboss.cache.loader.tcp.TcpCacheServer はコマンドラインで開始されたスタンドアロンプロセスか、 JBoss AS 内に組み込まれた MBean となります。 TcpCacheServer は別の JBossCache インスタンスへの参照を持ちます (独自で作成した参照か、 依存関係の挿入により JBoss が作成した参照など提供された参照になります)。
JBoss Cache 2.1.0 より、 TcpCacheServer への接続が切断されると
TcpDelegatingCacheLoader が透過的に再接続を処理するようになりました。
TcpDelegatingCacheLoader はリモート TcpCacheServer のホストとポートで設定され、 これを使用して通信を行います。 また、 TcpCacheServer への再接続を透過的に制御するため、 新しい任意のパラメータが 2 つ使用されます。
timeout プロパティ (デフォルト値は 5000) は、 キャッシュローダーが TcpCacheServer への接続を再試行し続ける時間を指定し、 この時間を超過すると再試行を断念し例外をスローします。 reconnectWaitTime (デフォルト値は 500) は、 通信の障害を検出した場合にキャッシュローダーが再接続を実行する前に待機する時間になります。 最後の 2 つのパラメータは、 キャッシュローダーに一定のフォールトトラレンスを追加し、 TcpCacheServer の再起動に対応するために使用することができます。
設定は次のようになります。
<loaders passivation="false" shared="false">
<preload>
<node fqn="/"/>
</preload>
<!-- if passivation is true, only the first cache loader is used; the rest are ignored -->
<loader class="org.jboss.cache.loader.TcpDelegatingCacheLoader">
<properties>
host=myRemoteServer
port=7500
timeout=10000
reconnectWaitTime=250
</properties>
</loader>
</loaders>
これは、 JBossCache が
myRemoteServer:7500 で実行されているリモートの TcpCacheServer にすべてのロード要求と保存要求を委譲することを意味します。
典型的なユースケースとしては、 同じクラスタ内でレプリケートされた複数の JBoss Cache インスタンスがすべて同じ TcpCacheServer インスタンスへ委譲する例があります 。TcpCacheServer は JDBCCacheLoader より TcpCacheServer 自体をデータベースへ委譲することがありますが、 ここで重要なのは 5 つのノードがすべて同じデータセットにアクセスしていると、 アンロードされたデータセットごとに 1 つのSQL ステートを実行する TcpCacheServer よりデータをロードすることです。 ノードがデータベースに直接アクセスすると、 同じ SQL が複数回実行されます。 したがって、 TcpCacheServer はデータベースの前にある自然なキャッシュとして機能します (ネットワークラウンドトリップがデータベースのアクセスよりも早い場合。 通常データベースのアクセスにはネットワークラウンドトリップも含まれます)。
単一障害点 (Single Point of Failure) の問題を軽減するために複数のキャッシュローダーを設定することができます。 最初のキャッシュローダーは ClusteredCacheLoader、 2 番目は TcpDelegatingCacheLoader、 最後は JDBCacheLoader とし、 低い方から順にキャッシュへアクセスする負荷を効果的に定義します。