スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: スポンサー広告

WCFのパフォーマンスアップを調査中

 WCFの基本的な通信方式は、SOAP(XML)で行われるーなんてのはよく知られている。が、WEBサービス(asmx)の頃からの認識(先入観)として、「XMLは重い」というのがあり、もっと応答速度を上げられないものか?と調査している。

○その一。バイナリ通信はどうだ?
 通常の通信はテキスト通信だけど、configの設定によってはバイナリ通信が可能である。CustomBindingを作り、BinaryEncoderを使う。詳細は、Performance Tuning WCF Services, Part 2の「Binary Encoding over HTTP」に記載されている。
 試してみたが、確かにバイナリで通信する。しかし、自分が試した環境では、セキュリティ設定に阻まれあまりうまく動作せず、セキュリティを甘く(ほぼ皆無にする)となんとか動作した。テキストに比べてサイズは減るけど、返って増えるときもある。また、IISの圧縮機能を有効にすると、テキスト形式の方が有利な感じがした。

○その二。圧縮通信はどうだ?
 これは、IIS7.5(IIS7?)以上であれば、IIS上で設定できる。WCFにも圧縮用エンコーダが標準で用意されるのは、4.5以降になる。要するに、バージョンアップしろって事だな。

○その三。シリアライザを変えてみよう。
  Googleが考案・開発した、Protbufでシリアライズ、デシリアライズできないか?とも考えたし、試してもみたけど、こいつの問題点は、シリアライズに失敗しても何も言わない(例外も発生しない)所と、Proxyクラスが作れないところかな。まあ、Proxyを作るくらいなら、インターフェースとデータクラスをライブラリ化して、クライアントとサーバーで共用した方が早そうだけど。シリアライザ覚書(参)で書いたけど、WCF用のビヘイビアとかある割に…なんだよなぁ。

○その四。RESTサービスはどうだろう?
 JSON形式でサービスが提供される。WCFでも実装が可能になる。よく記事として見かけるので、自分も試してみた。
 結果だけ、メモする。
 ・確かにJSON形式での通信はできた。Fiddler4で確認。
 ・クライアントのProxyは、SvcUtilで作られるものも使用できる。
 ・下り(サーバー→クライアント)はJSONにできたけど、上り(クライアント→サーバー)はできなかった。
 ・SvcUtilで作られるProxyでサービスを呼び出すと、すべてPOST通信になる。
 ・POST通信にすると、サービスメソッドの引数は、基本一つで、二つ以上になると、属性への設定追加が必要になる
  ただし、その設定をしても、二つ以上にすると上手く動かなかった。
 ・サービスメソッドの引数や戻り値に、多数のクラスから参照される基底的な役割をもったクラスを記述すると、最初の通信で異常に重くなる。

(最後の項目対する補足)
 オブジェクト指向脳的に言えば、メソッドの引数や戻り値は抽象的である(AbstractやInterface)方が好ましいとされるけど、WCFのサービスメソッドには当てはまらないらしい。
・クラスAを基底として、クラスB,C,Dを定義したとする。
・WCFのサービスメソッドの引数に、Aを指定して、B,C,Dどれでも設定できるようにする。
・この状態でProxyクラスを作ると、B,C,Dのどれが設定されても大丈夫なように、KnownTypeAttributeがメソッドの属性として設定される。数はそれもB,C,Dそれぞれ用に三つ。
・WCF通信で、サーバーとのチャンネルを開く際、どうもKnownTypeAttributeで指定されるクラスの情報も解析しているようで、この属性が3つだけなら良いが、これが20や30になってくると、通信開始時に、時間が掛かるようになる。実際、最初の通信に5秒もかかったメソッドには、このKnownTypeAttributeがこれでもかというくらいついていた(40個くらい)。

 で、現在の所、XMLでもJSONでも、IISが圧縮している限り、サーバーとクライアントの物理的な距離が短い時は、それほど変わらないという結果になっている。遠距離での通信はまだ試せていない。是非試したいなぁとか考えている最中だったりする。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WCF | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。