分散型インメモリキャッシュは、主流のJavaアプリケーションからErlangのような非主流の言語に至るすべてにおいて、ここ数年でかなりポピュラーになった。Microsoftは、主にオープンソース界で見られる技術に追いつくよう、かなりすさまじい努力を続け、独自の分散型キャッシュを発表した。
Velocity(サイト・英語)は.NETプラットフォーム用に特別に設計された分散型キャッシュである。その機能の多くは他の分散型インメモリキャッシュに慣れている人ならすぐに分かるであろう。Velocityは現在、コミュニティ技術プレビューとして利用可能である(source)。
Velocityのクライアントには2つのタイプがある。単純なクライアントは単一のキャッシュサーバーについてしか把握していない。要求されたオブジェクトをそのキャッシュサーバーで入手できない場合、キャッシュサーバーはそのオブジェクトを適切なサーバーから取り出す。ルーティングクライアントはもっと深くかかわる。ルーティングクライアントは特定のオブジェクトがどこに存在するかを常に把握し、該当のキャッシュサーバーに直接クエリーを送ることができる。キャッシュロケーションデータのすべてをルーティングクライアントに送信するパフォーマンスインパクトについては、これまで議論されていない。キャッシュサーバーに加え、どちらのタイプのクライアントも、ローカルキャッシュオプションをサポートしている。これはまだ、サーバーの無効なデータをチェックすることを必要とするが、大規模なキャッシュオブジェクトを処理する際のネットワークトラフィックは低減される。
並行性(コンカレンシー)に関して、2つのオプションが存在する。楽観的な並行性では、現在無効なオブジェクトへの最初の更新は成功し、それ以上の更新は失敗する。悲観的なロッキングでは、ロックハンドルが返される。ロックを解除するか、タイムアウトが終了するまで、ロックを取得する試みはすべて失敗する。ロックの取得に失敗した場合は、ノンブロッキング操作である。
オブジェクトは、有効期限になると、またはメモリ圧力が制限を超えると、明示的にキャッシュから削除される。このeviction(追い出し)として知られている最後の方法には、LRU(Least Recently Used; 最小使用頻度)アルゴリズムが採用されている。
オブジェクトには、キーの他に、タグの集合が関連付けされていることがある。タグのリストと一致する1つまたはすべてのオブジェクトを取り出す方法はいくつか存在する。
ASP.NETのセッションモデルに対するサポートはあるが、それはMicrosoftが思い描いている数ある用途の1つにすぎない。S Muralidhar氏(source)は次のように書いている。
ASP.NETに対する当社のサポートは、統合された.NETプラットフォームの話の一部にすぎません。ASP.NETアプリケーションだけに焦点を合わせているのではないので安心してください。一例として、当社はASP.NETが関係するとはかぎらないプレーンな.NETアプリケーション(たとえば、windowsサービス)やIISアプリケーションとの統合を計画しています。
次に、これから登場する機能について話します。現在のCTPは、スケールアウト、ローカルキャッシング、ASP.Net SessionStateの統合、その他多くのサポートを特徴としています。当社は、今後のCTPやRTMのために検討している作業項目が一杯に詰まったバッグを持っています。それには、可用性、複製されたキャッシュ、通知のサポートや、より良い管理サポートなどが含まれます。
プッシュベースの通知は、当社が多くの人々から受けている要求です。確かにそれは当社が深く調査している領域です。現在のCTPはこれをサポートしていませんが、近日のリリースで改善される可能性が非常に高いです。それまでの次善策として、ローカルキャッシュでVelocityを使用している場合は、ローカルキャッシュ内の無効または期限切れの可能性があるオブジェクトを処理するのに役立つ、GetIfVersionMismatch()のようなAPIを使用するといった方法があります(適切な動作を得るにはGet()とGetIfVersionMismatch()の組み合わせを使用する必要があります)。
より高度な技術のサポートも計画されている。Anil Nori氏(source)は次のように言い添えている。
> アプリケーションは、データアクセスにキャッシュを使用し始めたように、クエリー、トランザクション、分析性、同期化など、より豊富なデータサービスを要求するようになると私は考えています。たとえば、.NETアプリケーションは、バックエンドSQL Serverデータベースにクエリーを実行するのと同じように、分散型キャッシュでLINQクエリーを必要とするようになると当社は考えています。私たちは、「Velocity」がそのような包括的な分散型キャッシュプラットフォームになることを心に描いています。
原文はこちらです: