Azure In-Role Cache の Memcached ラッパー

重要

Microsoft では、すべての新しい開発で Azure Redis Cache を使用することをお勧めします。 Azure Cache オファリングの選択に関する最新のドキュメントとガイダンスについては、「自分に適した Azure Cache オファリング」を参照してください。

Memcache の概要

Memcache は、データベースから負荷を取り除くことにより、規模の大きい Web アプリケーションの高速化に役立つ、分散型のインメモリ キャッシュ ソリューションです。 Memcache はインターネットのさまざまな大規模 Web サイトで使われており、革新的な方法で他の技術と統合されています。

Azure は、既に Memcache を実装しているお客様が簡単に Azure に移行できるように、Memcache プロトコルをサポートしています。 アプリケーションで既に Memcache が使用されている場合、このコードを新しいコードに置き換える必要はありません。

Azure Caching と Memcache を実行する方法は、たとえばワーカー ロールで Memcache のみを実行する方法よりも推奨される選択肢です。 これは、正常なシャットダウン、高可用性、ローカル キャッシュ (クライアント shim)、通知 (クライアント shim)、データの整合性、高可用性 (HA)、およびクライアントに対して透過的な簡単なスケールアップとスケールダウンなど、Azure Caching が高付加価値な機能を提供しているためです。 たとえば、Azure Caching と Memcache のサーバー ハッシュ スキームとパーティション管理を使用すると、負荷を分散し、データの整合性を維持することができます。

Memcache プロトコルのサポート

Azure Caching は Memcache の接続プロトコルをサポートしています。 このプロトコルには、バイナリ バージョンとテキスト バージョンという 2 つのバージョンがあります。

Azure Caching は、独自の接続プロトコルに加え、このプロトコルをサポートしています。 Memcache クライアントには Azure との互換性を求めるべきです。 Azure Caching は、他の Memcache 実装がサポートする API のほとんどすべてをサポートしています。

そのため、ユーザーが Azure に Memcache アプリケーションを導入し、Azure の Memcache 実装でそのアプリケーションをポイントすれば、アプリケーションの追加変更なしで、そのまま動作を続けるはずです。

Memcache は、"サーバー ゲートウェイ" の使用と、"クライアント shim" の使用という 2 つ明確な開発者エクスペリエンスをサポートします。

Memcache サーバー ゲートウェイ

実装、デプロイ、および概念の理解という観点で考えると、サーバー ゲートウェイはシンプルですが、以下で説明する重要な注意事項もあります。

サーバー ゲートウェイを使用する場合、サーバー キャッシュ クラスターは Memcache ソケットをリッスンします。 つまり、ソケットを開き、Memcache プロトコルでパケットをリッスンします。 変換レイヤー (後述) はありません。

この機能を有効にするには、キャッシュ クライアントで、追加の内部エンドポイントを開き、名前を設定して、Memcache ポートにします。 このポートに対するすべてのトラフィックは、Memcache プロトコルで受信されます。

ただし、クライアント shim シナリオを使用する場合と比較すると、パフォーマンスの影響が出やすいシナリオでは、サーバー ゲートウェイのパフォーマンスが低下します。 これは、Memcache 実装が、Azure Caching のハッシュの実装方法とは異なる方法でハッシュを実装しているためです。 Memcache 実装とキャッシュ クライアントのハッシュ スキームは異なります。 Azure では、キャッシュ サーバーがハッシュを生成します。 Azure Caching の動作では、ハッシュ動作を指定するのはキャッシュ サーバーです。 これによって、サーバーの負荷分散、拡張、縮小、データ損失の防止などが可能になります。

Azure がアイテムをキャッシュすると、ハッシュはアイテムのキーに基づいて生成されます。 Azure はハッシュを使用して、キャッシュ済みアイテムを含めるキャッシュ クライアント内のサーバーを決定します。 その結果、Azure サーバー ゲートウェイはキーを再ハッシュし、キャッシュ クライアント内の対象サーバーにアイテムを転送します。 この操作の場合、ネットワーク ホップ数が増えるため、パフォーマンスは低下します。

Memcache クライアント Shim

Memcache クライアント shim は、キャッシュにアクセスするクライアントにインストールされます。 一般的に、これはアプリケーションそのものを持つ Azure ロールです。 クライアント shim はローカル キャッシュをサポートします。

この shim は変換レイヤーです。 このレイヤーで、Memcache クライアントの呼び出しが Azure Caching API に変換されます。 shim には、Memcache プロトコル ハンドラーと Azure Caching クライアントという 2 つの部分があります。 Azure Caching API に対する Get と Put の呼び出しがどこで行われる場合でも、変換レイヤーの shim はクライアント自体にインストールされます。

Memcache クライアントに、Memcache サーバーとしてのロールホストが示されている場合、Put 操作は、Azure 内のキャッシュ サーバーではなく、まず shim のローカル インスタンスによって処理されます。 次に shim は、キャッシュ クラスター内の正しい対象サーバーを決定し、Put 操作を Azure にリダイレクトします。

これによって、サーバー ゲートウェイのシナリオに存在する余計なネットワーク ホップがなくなります。 欠点は、この shim を入手し、アプリケーションに配置する必要があることです。

サーバー ゲートウェイの使用とクライアント shim の使用

キャッシュには、併置型キャッシュと専用キャッシュ ロールという 2 つのキャッシュ トポロジがあります。

専用キャッシュ ワーカー ロールにキャッシュ クライアントをデプロイする場合、そのキャッシュ クライアントから Memcache shim を使用します。 この方法の方がパフォーマンスが高くなり、自動検出コードを回避できます。

併置型キャッシュを使用し、キャッシュ クライアントが同じロールでホストされている場合は、Memcache サーバー ゲートウェイを使用します。 クライアント shim を使用する場合、処理とリダイレクトのために追加のレイヤーが必要です。同じロール内からキャッシュにアクセスする場合、クライアント shim は必要ありません。 リダイレクトが増えると、不要なオーバーヘッドも増えます。

サーバー ゲートウェイまたはクライアント shim を使用するプログラミング モデルはありません。 必要なことは、構成設定の変更のみです。 また、クライアント shim のインストールも必要になります。

サーバー ゲートウェイまたはクライアント shim の使用は、プログラミング モデルの操作というよりは、デプロイ操作です。 プログラマであれば、同じ Get または Put API を呼び出す場合があります。この場合、アプリケーションの接続方法のみがやや異なります。 元のキャッシュ サーバーを示す代わりに、サーバー ゲートウェイまたはクライアント shim を示すようになります。

最後に、サーバー ゲートウェイとクライアント shim はいずれも、使用されている Memcache クライアント ライブラリを認識していません。これは、標準の Memcache 実装が同じプロトコルを使用しているためです。 キャッシュ サーバーは、標準の Memcache プロトコルに従うデータのパケットとは関係がありますが、Memcache クライアント実装自体とは関係がありません。

Azure アプリケーション用にサーバー ゲートウェイをデプロイする方法

  1. キャッシュ サーバーをホストするロールで、ロールのプロパティを開き、[キャッシュ] タブを開きます。

  2. [キャッシュを有効にする] チェック ボックスをオンにします。  これにより、csdef、importModule 要素、およびその他の csdef/cscfg 設定に入力エンドポイントが追加されます。 次のデプロイ操作は、[エンドポイント] タブで "memcache_default" という入力エンドポイントを手動で追加することです。

  3. 次に、このクラスターを示すようにクライアントを構成する必要があります。 併置型キャッシュ、または専用のキャッシュがあるクライアント shim と共にサーバー ゲートウェイを使用する場合は、アプリケーションが "localhost_thisrolename" を示すようにします。この場合、自動検出は不要です。

Azure アプリケーション用にクライアント Shim をデプロイする方法

  1. Memcache クライアントのあるロールで、ロール名を右クリックし、[ライブラリ パッケージ参照の追加] を選択し、NuGet ウィンドウを起動します。

  2. [Azure Caching Memcache Shim] を検索します。 この NuGet パッケージをインストールします。

  3. このパッケージは起動タスクを作成し、memcache_default の内部エンドポイントを追加し、それを 11211 にマップし、適切な dataCacheClients セクションを App.config と web.config に追加します。これは [内部エンドポイント] タブで変更できます。

  4. App.config または web.config の autoDiscovery 要素にロール名を指定します

  5. ここで Shim を「ポイントする」ようにクライアントを構成する必要があります。 memcache クライアント構成を編集し、サーバーを「localhost」に設定します。 正しいポート番号も設定する必要があります。