Coherenceと1年付き合ってみた

 OracleのインメモリーグリッドCoherenceを使った開発に携わり1年立ちました。途中の数ヶ月は別の事もやったりで比較的まったりやっていましたが、この辺でちょっと整理。別に筆者が選定した訳ではありませんが、今携わっている仕事でCoherenceを使う事になったのは、Webサービスでミッションクリティカルかつ、応答レスポンスの最小化という要件を満たす為でした。構成はこんな感じです。

構成

 上記のWebLogicにデプロイされているフロントアプリケーションと、別途バックにJavaVMで動作させているプロセスの両方にCoherenceのキャッシュデータが配置されます。フロントは静的かつアクセス頻度が高いマスタ系データをレプリケーションキャッシュとして配置、バック側は主にトランザクション系データを分散キャッシュとして配置することで、分散かつ他のプロセスにバックアップを取ってくれます。コンフィグ次第で他サーバとかにバックアップを取るようにも出来るようです。またバックキャッシュではキャッシュストアといって、キャッシュに無ければDBに取りに行ったり、キャッシュに入ったものをDBへ入れたりする機能が動作します。
 Coherenceに関してコードを書くところは、キャッシュに格納するデータとなるエンティティモデル、上記のキャッシュストア、その他必要に応じてイベント処理やビジネスロジック側の為にDAO的なものを用意するくらいです。

 まず、エンティティモデルとしてPortableObjectを実装します。こんな感じです。

 上記の例ではキー項目が取引年月日と所属先IDと取引番号の3つですが、KeyValueなので1項目のキーとしてgetIdというメソッドを入れてます。
 
 次にバックキャッシュ側で動作するCacheStoreを実装します。こんな感じ。

上記はDB書き込みのみの実装例です。

 この先はコンフィグを3つ書きます。凝った事をしなければフロント用もバック用も同じものでOKです。これらはJVM起動時オプションで指定します。クラスパス内ならファイル名だけ、外に置いてもフルパスで指定すればOKです。

 まず、キャッシュのクラスタ設定ですが、基本的にクラスタ名だけ書いておけば後は勝手に各プロセスが連携してくれます。
 起動オプションは、-Dtangosol.coherence.override=tangosol-coherence-override.xml

 次にPortableObjectとして実装したものをPOFコンフィグに書いておきます。番号は1000以上で適当に並べます。
 起動オプションは、-Dtangosol.pof.config=pof.xml

 最後に各キャッシュ構成として、キャッシュのタイプや構成、作成したキャッシュストア等を書きます。
 起動オプションは、-Dtangosol.coherence.cacheconfig=cache-config.xml

 上記ですとuserMstはレプリケーションキャッシュ、RequestTrnは分散キャッシュでOutOfMemory対策として1プロセス最大100万件まで、処理負荷分散の為にスレッドを3つ、キャッシュストアは応答レスポンスを意識してキャッシュ書き込み5秒後に非同期で動作するという内容です。最後のProxyはクラスタ構成プロセス外からのアクセス(*Extends)がある場合の受信口を用意している形になってます。なお、複数プロセスを動作させる場合は、PORTを個々に指定します。

Coherence開発環境作成

これは昨年からの備忘録です。。

開発対象のインフラターゲットは、RHEL+WebLogic12 + Coherence + OracleDB 12cという構成

開発環境
Windows7, Oracle Enterprise Pack for Eclipse(OEPE Luna)
OracleDB(開発用にOracleXE)は別途インストール

WebLogicは、管理サーバ自体にアプリケーションをデプロイするようになってました。
(管理対象サーバ追加の仕方がよくわからなかったので・・)

OracleのWebからOEPEをダウンロード
インストール後、
WLSの起動時の環境設定バッチ setDomainEnv.cmd に下記を追加

↓Coherence設定ファイル等を外出しにする為、WebLogic起動時の引数として設定してます
set JAVA_OPTIONS=%JAVA_OPTIONS% -Dtangosol.coherence.distributed.localstorage=false
set JAVA_OPTIONS=%JAVA_OPTIONS% -Dtangosol.coherence.override=c:\dev\bin\tangosol-coherence-override.xml
set JAVA_OPTIONS=%JAVA_OPTIONS% -Dtangosol.coherence.cacheconfig=c:\dev\bin\cache-config.xml
set JAVA_OPTIONS=%JAVA_OPTIONS% -Dtangosol.pof.enabled=true -Dtangosol.pof.config=c:\dev\bin\pof-config.xml

set CLASSPATH=%CLASSPATH%;C:\Oracle\Middleware\Oracle_Home\coherence\lib\coherence.jar

↑Coherenceがインストールされた場所にあるライブラリを指定

インフラターゲット側では管理対象サーバで動かすので、WebLogicコンソールから上記をJVM実行引数として追加すればOKでした