2013年12月26日木曜日

ARR Disk Cacheとフィーチャーフォン

Configure and Enable Disk Cache in Application Request Routing : The Official Microsoft IIS Site

ARRを導入してるならぜひとも使っておきたい機能ですね。
Disk Cacheの有無で内部トラフィックや内部サーバーはずいぶんと楽になります。もちろんCDNは使うんですけど、CDNを使うかどうかにかかわらずです。

Using Compression in Application Request Routing : The Official Microsoft IIS Site

ちなみにDisk CacheをOnにした場合、ScavengerっていうのがDiskのクリーニングをするんですが、マルチテナントだとそのIOがてーへんなことになるので、極力Flash Driveを使うようにしましょう。コンテンツがそんなに多くなくて問題にならない(確認しつつ)HDDでも全然さばけます。

サーバーファームにしてなくてもARRにするだけで接続をうまく制御できるので、おすすめです。って話は前と変わらないんですけど、今回はちょっと決定打が見当たらない問題についてです。

そもそもDisk CacheをOnにするときってWebFarm単位で指定するんですけど、その際にフィーチャーフォンなんかのutf-8でリクエストを受け取れないものがある場合、残念なことに502.3でエラーです。


URL引数に"?日本語"っていうのをShift_JISでURL Encodeして渡してます。これUTF-8だと問題ないんです。どういうことかというと、キャッシュされてるものをみるとなんとなくわかるんですけど。


キャッシュしたファイル名にURL引数の値がそのままくっついて生成されます。もちろんキャッシュするさいにQuery StringをIgnoreにすると関係なくなるんですけどね。

Configure Caching with Query String Support in Application Request Routing : The Official Microsoft IIS Site

で、じゃー、system.webのglobalization(globalization 要素 (ASP.NET 設定スキーマ))で指定しとけばいいじゃん、て思うでしょ?
ダメなんすよ、タイミング的に先にキャッシュの有無を確認してからだし、そもそもARRのアプリケーションプールはマネージコード無しだしー。先にDiskをチェックするからこそ!ですよね。

要求トレースしとくと、エラー出てますよね。



気持ちはわかりますよ。Windows 用の Http.sys レジストリ設定とかでFavorUTF8とかつっても、ARRがエラーです、って言ってんだから。そもそもDiskキャッシュOnにしなければ、Shift_JISだろうとエラーにならないわけですから、この辺も関係ないんですよね。

つまり、C:\Program Files\IIS\External Disk Cacheにインストールされるecache.dllがですね、ネイティブですけど、文字コード固定なんですよ、きっと。できることなら指定できるようにしてほしい。そもそもQueryStringそのまま信じて処理しないでほしい。ファイル名もエンコードしたものでそのまま生成してくれればいいのに。


UTF-8縛りでいいじゃん!っていうのもね、そうなんですけどー。なかなかさー。
こういう場合はどういう方法とるのがいいのか、悩ましいところですけど、管理手間は増えるけどDiskキャッシュのOn/OffでそれぞれのWebFarmを用意する、っていうのしか手がなさそうなんですよねー。

  http://normal.website
  http://sjis.website
  http://contents.website

とかURLがそもそもわかれる場合は3番目のサイトだけDiskキャッシュOnとかさ。でも、混在させるじゃない、何気に。

  http://composite.website
  http://composite.website/mobile

とかね。そーするとWebFarmのルーティングルールでフォルダ単位でWebFarm区切る。
なかなか、手間かかるところでは、ありますが、最初の定義だけなんでね、その辺は。それよりサーバー利用効率あげたいしー。

と、いうわけで、決め手に欠けるエラー回避(消極的な)しか思いつかなくて、しょんぼりです。