この章の内容は次のとおりです。
memcachedアダプタはCoherenceプロキシ・サーバー上にあり、Coherence*Extendスタイルのアクセプタとして実装されています。memcachedクライアントは、クラスタ上で分散キャッシュ操作を管理するアクセプタに接続します。キャッシュ操作はエントリ・プロセッサ操作として実行されます。Coherenceでキャッシュされたデータをやり取りするために、まずアクセプタをプロキシ・サービス内で有効化する必要があります。memcachedクライアントとの通信の保護やCoherence固有のクライアントとのデータの共有を行う追加機能も提供され、必要に応じて構成できます。
図5-1は、分散キャッシュを使用するためにCoherenceプロキシ・サーバー上にあるmemcachedアクセプタに接続するmemcachedクライアントの概念図を示しています。
memcachedアダプタは、固有のmemcachedアクセプタを使用してプロキシ・サービス内で構成されます。アクセプタの構成によって、memcachedクライアントが使用するソケット・アドレスおよび分散キャッシュ定義されます。
この項には次のトピックが含まれます:
memcachedアダプタは、クライアントからの接続を受けるためのソケット・アドレス(IPまたはDNS名のどちらかおよびポート)を使用します。ソケット・アドレスは、オペレーション・オーバーライド構成ファイルの<address-provider
要素で構成されます。その後、アドレスは構成されたid
属性によってプロキシ・サービス定義から参照されます。Oracle Coherenceでのアプリケーションの開発のaddress-providerを参照してください。
次の例では、IPアドレスに198.168.1.5
を、ポートに9099
を、IDにmemcached
を使用してソケット・アドレスを構成しています。
... <cluster-config> <address-providers> <address-provider id="memcached"> <socket-address> <address>198.168.1.5</address> <port>9099</port> </socket-address> </address-provider> </address-providers> </cluster-config> ...
プロキシ・サービスによって、リモート・クライアントはクラスタ・メンバーにならずにCoherenceクラスタのキャッシュ・サービスとやり取りできます。memcachedアダプタ用のプロキシ・サービスには、定義されたソケット・アドレスでmemcachedクライアントのリクエストを受け付け、分散キャッシュにそのリクエストを委任する特定のmemcachedアクセプタが含まれています。
注意:
memcachedアダプタは、分散キャッシュのみを使用できます。
memcachedクライアント用のプロキシ・サービスを作成するには、キャッシュ構成ファイルを編集して<proxy-scheme
要素を追加し、<acceptor-config
要素の中に<memcached-acceptor
要素を含めます。<memcached-acceptor
要素には、使用するキャッシュの名前およびmemcachedクライアント通信のためにリスニングするソケット・アドレスを定義するアドレス・プロバイダ定義への参照を含める必要があります。『Oracle Coherenceでのアプリケーションの開発』のmemcached-acceptorに関する項を参照してください。
次の例では、プロキシ・サービスを作成し、memcachedアクセプタを定義しています。この例は、memcachedアダプタ・ソケット・アドレスの定義で定義されたアドレス・プロバイダを参照しています。
... <caching-schemes> <proxy-scheme> <service-name>MemcachedProxyService</service-name> <acceptor-config> <memcached-acceptor> <cache-name>hello-example</cache-name> <address-provider>memcached</address-provider> </memcached-acceptor> </acceptor-config> <autostart>true</autostart> </proxy-scheme> </caching-schemes> ...
キャッシュ名は、hello-example
キャッシュを参照します。キャッシュ名は、分散キャッシュに解決する必要があります。次の例は、hello-example
キャッシュの定義およびそれにマッピングされる分散スキームを示しています。
<?xml version="1.0"?> <cache-config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.oracle.com/coherence/coherence-cache-config" xsi:schemaLocation= "http://xmlns.oracle.com/coherence/coherence-cache-config coherence-cache-config.xsd"> <caching-scheme-mapping> <cache-mapping> <cache-name>hello-example</cache-name> <scheme-name>distributed</scheme-name> </cache-mapping> </caching-scheme-mapping> <caching-schemes> <distributed-scheme> <scheme-name>distributed</scheme-name> <service-name>MemcachedTest</service-name> <backing-map-scheme> <local-scheme/> </backing-map-scheme> <autostart>true</autostart> </distributed-scheme> <proxy-scheme> <service-name>MemcachedProxyService</service-name> <acceptor-config> <memcached-acceptor> <cache-name>hello-example</cache-name> <address-provider>memcached</address-provider> </memcached-acceptor> </acceptor-config> <autostart>true</autostart> </proxy-scheme> </caching-schemes> </cache-config>
次の例は、spymemcachedクライアントAPIを使用してmemcachedアダプタの設定で定義したmemcachedアダプタ用のプロキシ・サービスに接続する単純なHello Worldクライアントを示しています。
import net.spy.memcached.AddrUtil; import net.spy.memcached.BinaryConnectionFactory; import net.spy.memcached.MemcachedClient; public class MemcachedExample { public static void main(String[] args) throws Exception { String key = "k1"; String value = "Hello World!"; MemcachedClient c = new MemcachedClient( new BinaryConnectionFactory(), AddrUtil.getAddresses("198.168.1.5:9099")); c.add(key, 0, value); System.out.println((String)c.get(key)); c.shutdown(); } }
この項には次のトピックが含まれます:
memcachedクライアントは、memcachedアダプタに接続する際にSASLプレーン認証を使用してユーザー名およびパスワードを提供できます。SASLプレーン認証を使用するには、IdentityAsserter
の実装をプロキシに作成する必要があります。memcachedアダプタはIdentityAsserter
の実装を呼び出し、トークンとしてcom.tangosol.net.security.UsernameAndPassword
オブジェクトを渡します。『Oracle Coherenceの保護』のIDトークンを使用したクライアント接続の制限に関する項を参照してください。SASLプレーン接続の確立の詳細は、ご使用のmemcachedクライアントのドキュメントを参照してください。
SASLプレーン認証を使用するには、IdentityAsserter
の実装に加えてmemcachedアダプタで認証を有効化する必要があります。認証を有効化するには、キャッシュ構成ファイルのプロキシ・サービス定義を編集して<memcached-acceptor>
要素に<memcached-auth-method>
要素を追加し、それをplain
に設定します。
... <caching-schemes> <proxy-scheme> <service-name>MemcachedProxyService</service-name> <acceptor-config> <memcached-acceptor> <cache-name>hello-example</cache-name> <memcached-auth-method>plain</memcached-auth-method> <address-provider>memcached</address-provider> </memcached-acceptor> </acceptor-config> <autostart>true</autostart> </proxy-scheme> </caching-schemes> ...
この項には次のトピックが含まれます:
多くのmemcachedクライアント・ライブラリには、カスタム・シリアライザをプラグインする機能が含まれています。カスタム・シリアライザのプラグイン方法の詳細は、ご使用のmemcachedクライアントのドキュメントを参照してください。次の抜粋は、手順3で登録したPofUser
オブジェクトを追加し、spymemcachedトランスコーダを使用してPOFシリアライザをプラグインするspymemcachedクライアントを示しています。
MemcachedClient client = m_client; String key = "pofKey"; PofUser user = new PofUser("memcached", 1); PofTranscoder<PofUser> tc = new PofTranscoder("memcached-pof-config.xml"); if (!client.set(key, 0, user, tc).get()) { throw new Exception("failed to set value"); }
POFトランスコーダ・プラグインは次のように定義されています:
import com.tangosol.io.pof.ConfigurablePofContext; import com.tangosol.util.Binary; import com.tangosol.util.ExternalizableHelper; import net.spy.memcached.CachedData; import net.spy.memcached.compat.SpyObject; import net.spy.memcached.transcoders.Transcoder; public class PofTranscoder<T> extends SpyObject implements Transcoder<T> { public PofTranscoder(String sLocator) { m_ctx = new ConfigurablePofContext(sLocator); } @Override public boolean asyncDecode(CachedData arg0) { return Boolean.FALSE; } @Override public T decode(CachedData cachedData) { int nFlag = cachedData.getFlags(); Binary bin = new Binary(cachedData.getData()); return (T) ExternalizableHelper.fromBinary(bin, m_ctx); } @Override public CachedData encode(Object obj) { byte[] oValue = ExternalizableHelper.toByteArray(obj, m_ctx); return new CachedData(FLAG, oValue, CachedData.MAX_SIZE); } @Override public int getMaxSize() { return CachedData.MAX_SIZE; } protected ConfigurablePofContext m_ctx; protected static final int FLAG = 4;