ASP .NET MVC 3を使用してWebアプリケーションを作成しています。MemoryCacheオブジェクトを使用したいのですが、負荷分散されたWebサーバーで問題が発生するのではないかと心配しています。私がグーグルで検索すると、その問題はサーバー上で解決されているように見えます。つまり、AppFabricを使用しています。会社に負荷分散されたサーバーがある場合、それらのサーバーでAppFabricまたは同様のものが実行されていることを確認しますか?または、このための開発者として私ができること、またはすべきことはありますか?
2 に答える
まず、ASP.NETの場合、MemoryCacheではなくASP.NETキャッシュを確認する必要があります。MemoryCacheは、.NET 4.0で導入された汎用キャッシュAPIであり、非WebアプリケーションでASP.NETキャッシュと同等のものを提供します。
AppFabricは、すべてのWebサーバーからアクセスできる単一の論理キャッシュを提供するという点で、キャッシュされたデータの独自のインスタンスを持つ複数のサーバーの問題を解決すると言っても過言ではありません。問題の解決策としてそれを飛び越える前に、考慮すべきことがいくつかあります。
Windows Serverの一部としては出荷されません。おっしゃるように、使用する場合はサーバーにインストールする必要があります。AppFabricがリリースされたとき、Windows Serverの次のリリースの一部として出荷されるという提案がありましたが、それが事実であることを確認するWindowsServer2012については何も見ていません。
そのために追加のサーバーが必要です。少なくとも、サーバーを用意することをお勧めします。AppFabricに対するMicrosoftの推奨事項は、専用サーバーで実行することです。つまり、AppFabric自体は無料でダウンロードできますが、追加のWindowsServerライセンスコストが発生する可能性があります。そういえば...
EnterpriseEditionのライセンスが必要になる場合があります。AppFabricの高可用性機能を使用する場合は、StandardEditionよりも高価なライセンスであるEnterpriseEditionを実行しているサーバーでのみこれを実行できます。
結局、あなたはそれを必要としないかもしれません。これの一部は、アプリケーションと、共有キャッシュレイヤーを使用する理由によって異なります。複数のサーバー上のキャッシュがデータベースと(または実際には相互に)同期しなくなる可能性があることが懸念される場合は、SqlCacheDependencyオブジェクトを適切に使用すると、問題を回避できる可能性があります。
このCodeProjectの記事「Redisを使用したローカルMemoryCache無効化の実装」では、説明するシナリオを処理するためのアプローチを提案しています。
使用している負荷分散のフレーバーについては言及していません。「スティッキー」または「ステートレス」です。はるかに簡単な解決策は、スティッキーセッションを使用することです。
ローカルメモリキャッシュとステートレスロードバランシングを使用する場合は、サーバー間無効化メッセージが遅れて到着する競合状態になる可能性があります。これは、ASP.NetMVCで非常に一般的なPost-Redirect-Getパターンを使用する場合に特に問題になる可能性があります。これは、Cookieを使用してキャッシュ無効化ブロードキャストを補足することで克服できます。これについては、こちらのブログ投稿で詳しく説明しています。