WCFサービスにprotobuf zを適用
7147 ワード
protobufはgoogleが提供するオープンソースシーケンス化フレームワークであり、XML、JSONのようなデータ表現言語に類似しており、その最大の特徴はバイナリベースであるため、従来のXML表現よりも効率がはるかに短い.バイナリデータフォーマットですが、複雑になることはありません.開発者は、一定の構文に従って構造化されたメッセージフォーマットを定義し、コマンドラインツールに送ります.ツールは関連するクラスを自動的に生成し、java、c++、pythonなどの言語環境をサポートします.これらのクラスをプロジェクトに含めることで、関連メソッドを簡単に呼び出して、ビジネス・メッセージのシーケンス化と逆シーケンス化を完了できます.
protobufはgoogleの中で比較的核心的な基礎ライブラリであり、分布式演算として大量の異なる業務メッセージの伝達に関わり、これらの業務メッセージをどのように効率的に簡潔に表現し、操作するかはgoogleのような大規模な応用において極めて重要である.protobufのようなライブラリは、効率、データサイズ、使いやすさのバランスが取れています.
詳細については、公式ドキュメントを参照してください.
protobufのようなライブラリは便利で効率的であり、ネットワークプログラミングでビジネスメッセージのシーケンス化、逆シーケンス化サポートに使用されることが自然に考えられます.UDPプロトコルベースのネットワークアプリケーションでは、UDP自体に境界があるため、protobufでビジネスメッセージを処理するのが便利です.しかし、TCPアプリケーションでは、TCPプロトコルにメッセージ境界がないため、トラフィックメッセージ境界を決定するメカニズムが必要である.TCPネットワークプログラミングではこれが直面しなければならない問題である.tcpネットワークプログラミングでは,トラフィックメッセージを逆シーケンス化するには,まずトラフィックデータのサイズを知る必要がある.また、実際のアプリケーションでは、1つの送信操作で複数のビジネスメッセージを送信し、各ビジネスメッセージのサイズ、タイプが異なる場合があります.また、ファイルなどの大きなデータストリームを送信する可能性があります.メッセージ境界の確認問題はprotobufライブラリとは関係なく、自分で解決しなければならないことは明らかです.公式文書でもprotobufはビッグデータの処理にはあまり適していないと述べており、ビジネスメッセージが1 Mを超えると、別の代替案を使用すべきかどうかを考慮すべきである.もちろん、ビッグデータについては、複数の小さなブロックに分割してprotobufで小さなブロックメッセージパッケージを作って伝達することもできます.しかし、多くのアプリケーションでは、大きなファイルを送信するなど、受信者がプロトコルスタックから受信したデータの数をディスクに書き込むのが一般的で、受信しながら処理するストリームモードであり、受信するたびに受信したデータ量とは基本的に関係ありません.このモードで小さなメッセージに分割して逆シーケンス化することは多くのことである.
WCFのようなネットワークプログラミングフレームワークを借りて、protobufのようなシーケンス化フレームワークを組み合わせると、ネットワークプログラミングにおける技術インフラストラクチャのレベルのものは私たちに解決の差が少なく、私たちは本当にビジネスの実現に注目することができます.
protobufのdotNetはprotobuf-netを実現し、WCFのDataContactをサポートし、WCFプログラムはほとんど修正を必要とせずに使用できる.
最小の動作可能な例はprotobuf-netが提供する(client,server)であり、それは共有契約の方式を使用し、WCFの構成方式を通じて、Endpoint-behaviorを追加し、カスタムWCF拡張を参照する.
クライアントとサービス側にこのbehaviorを追加します.例えば、次の例です.
クライアント:
サービス:
注意事項:
1、クラス継承階層は1階層のみサポート
2.WCFのKnownTypeに類似し、ProtobufはProtoInclude http://stackoverflow.com/questions/6541718/protobuf-net-wcf-multiple-nested-generic-abstract-objects-serialization-v282を使用する
3、 How to add dynamically a list of known type to a Protobuf-net formatter?
参考記事:
.netバイナリシーケンス化、XMLシーケンス化、ProtoBufシーケンス化の圧縮比較
http://www.cnblogs.com/onlytiancai/archive/2009/07/02/protobuf_net_test.html
Windows Communication Protocols (MCPP) http://msdn.microsoft.com/en-us/library/cc216513(PROT.10).aspx
Silverlight Binary Serialization using Protobuf-net
http://www.codeproject.com/KB/silverlight/silverlight-protobufnet.aspx
http://marcgravell.blogspot.com/search/label/protobuf-net
http://blogs.msdn.com/b/dmetzgar/archive/2011/03/29/protocol-buffers-and-wcf.aspx
http://www.drdobbs.com/windows/working-with-protobuf-wcf-services/240159282?pgno=1
protobufはgoogleの中で比較的核心的な基礎ライブラリであり、分布式演算として大量の異なる業務メッセージの伝達に関わり、これらの業務メッセージをどのように効率的に簡潔に表現し、操作するかはgoogleのような大規模な応用において極めて重要である.protobufのようなライブラリは、効率、データサイズ、使いやすさのバランスが取れています.
詳細については、公式ドキュメントを参照してください.
protobufのようなライブラリは便利で効率的であり、ネットワークプログラミングでビジネスメッセージのシーケンス化、逆シーケンス化サポートに使用されることが自然に考えられます.UDPプロトコルベースのネットワークアプリケーションでは、UDP自体に境界があるため、protobufでビジネスメッセージを処理するのが便利です.しかし、TCPアプリケーションでは、TCPプロトコルにメッセージ境界がないため、トラフィックメッセージ境界を決定するメカニズムが必要である.TCPネットワークプログラミングではこれが直面しなければならない問題である.tcpネットワークプログラミングでは,トラフィックメッセージを逆シーケンス化するには,まずトラフィックデータのサイズを知る必要がある.また、実際のアプリケーションでは、1つの送信操作で複数のビジネスメッセージを送信し、各ビジネスメッセージのサイズ、タイプが異なる場合があります.また、ファイルなどの大きなデータストリームを送信する可能性があります.メッセージ境界の確認問題はprotobufライブラリとは関係なく、自分で解決しなければならないことは明らかです.公式文書でもprotobufはビッグデータの処理にはあまり適していないと述べており、ビジネスメッセージが1 Mを超えると、別の代替案を使用すべきかどうかを考慮すべきである.もちろん、ビッグデータについては、複数の小さなブロックに分割してprotobufで小さなブロックメッセージパッケージを作って伝達することもできます.しかし、多くのアプリケーションでは、大きなファイルを送信するなど、受信者がプロトコルスタックから受信したデータの数をディスクに書き込むのが一般的で、受信しながら処理するストリームモードであり、受信するたびに受信したデータ量とは基本的に関係ありません.このモードで小さなメッセージに分割して逆シーケンス化することは多くのことである.
WCFのようなネットワークプログラミングフレームワークを借りて、protobufのようなシーケンス化フレームワークを組み合わせると、ネットワークプログラミングにおける技術インフラストラクチャのレベルのものは私たちに解決の差が少なく、私たちは本当にビジネスの実現に注目することができます.
protobufのdotNetはprotobuf-netを実現し、WCFのDataContactをサポートし、WCFプログラムはほとんど修正を必要とせずに使用できる.
最小の動作可能な例はprotobuf-netが提供する(client,server)であり、それは共有契約の方式を使用し、WCFの構成方式を通じて、Endpoint-behaviorを追加し、カスタムWCF拡張を参照する.
<behaviors>
<endpointBehaviors>
<behavior name="protoEndpointBehavior">
<protobuf/>
</behavior>
</endpointBehaviors>
</behaviors>
<extensions>
<behaviorExtensions>
<add name="protobuf" type="ProtoBuf.ServiceModel.ProtoBehaviorExtension, protobuf-net, Version=2.0.0.280, Culture=neutral, PublicKeyToken=257b51d87d2e4d67"/>
</behaviorExtensions>
</extensions>
</system.serviceModel>
クライアントとサービス側にこのbehaviorを追加します.例えば、次の例です.
クライアント:
<client>
<endpoint address="http://localhost:33545/Service1.svc" binding="wsHttpBinding"
bindingConfiguration="WSHttpBinding_IService1" contract="ServiceReference1.IService1"
name="WSHttpBinding_IService1" behaviorConfiguration="protoEndpointBehavior">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
</client>
サービス:
<endpoint address="" binding="wsHttpBinding" contract="TestWcfDto.IService1" behaviorConfiguration="protoEndpointBehavior">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
</service>
注意事項:
1、クラス継承階層は1階層のみサポート
2.WCFのKnownTypeに類似し、ProtobufはProtoInclude http://stackoverflow.com/questions/6541718/protobuf-net-wcf-multiple-nested-generic-abstract-objects-serialization-v282を使用する
3、 How to add dynamically a list of known type to a Protobuf-net formatter?
参考記事:
.netバイナリシーケンス化、XMLシーケンス化、ProtoBufシーケンス化の圧縮比較
http://www.cnblogs.com/onlytiancai/archive/2009/07/02/protobuf_net_test.html
Windows Communication Protocols (MCPP) http://msdn.microsoft.com/en-us/library/cc216513(PROT.10).aspx
Silverlight Binary Serialization using Protobuf-net
http://www.codeproject.com/KB/silverlight/silverlight-protobufnet.aspx
http://marcgravell.blogspot.com/search/label/protobuf-net
http://blogs.msdn.com/b/dmetzgar/archive/2011/03/29/protocol-buffers-and-wcf.aspx
http://www.drdobbs.com/windows/working-with-protobuf-wcf-services/240159282?pgno=1