web-dev-qa-db-ja.com

ZeroMQ +プロトコルバッファー

ZeroMQ FAQ ページでは、メッセージコンテンツをシリアル化する方法としてGoogleの protobuf の使用を提案しています。

誰かが良い使用例を見ましたか?

「メッセージをシリアライズすることの最大の利点は何ですか?」 -それが私なしで生きることができ、より細いパイプラインの利点を活用できるものであるかどうか。

.protoファイルとprotocコンパイラの考え方がとても気に入っています。

また、遊び場で投げるもう1つの優れたツールはlibevです。コメントは歓迎します:)

31
errordeveloper

ZMQを介して通信するプログラムが常に互いのバイナリ形式を理解できると100%確信している場合(たとえば、常に一緒に配布され、すべて同じコンパイラオプションでコンパイルされているため)何も表示されません。シリアル化によって追加されるオーバーヘッドにメリットがあります。

上記の条件が満たされない場合(異なるホストタイプで実行されているパートナープログラム、異なる言語で記述されたプログラム、または時間とともに独立して進化できるパートナープログラムなど-生のバイナリ構造に非互換性が生じる可能性があります)、シリアライゼーションはおそらくおそらく必要があります。

今日、誰もが彼らの兄弟がシリアル化ソリューションを作成しているようです。これは、すべてのソリューションに適したサイズがないことを示している可能性があります。 このページ には、27(!!)種類のシリアル化システムのシリアル化時間、非シリアル化時間、およびサイズのかなり完全なベンチマークが含まれています。そのページの最初の段落をスキップしないでください。「警告、ベンチマークは誤解を招く可能性があります」と書かれています。あなたのアプリケーション、あなたのデータはあなたにとって重要ですが、そこに提示されたデータはあなたが詳細に研究したい選択を絞り込むのに役立つかもしれません。

22
fvu

JavaおよびC++を介してメッセージを送受信するサンプルを以下に示します。

Javaでのシリアライズ:

Person person = Person.newBuilder().setName("chand")
    .setEmail("[email protected]").setId(55555).build();
socket.send(person.toByteArray(), 0);

Javaで逆シリアル化:

byte[] reply = socket.recv(0);
Person person2 = Person.parseFrom(reply);

C++でのシリアライズ:

Person p = Person();
std::string str;
p.SerializeToString(&str);
int sz = str.length();
zmq::message_t *query = new message_t(sz);
memcpy(query->data (), str.c_str(), sz);
socket->send (*query);

C++での逆シリアル化

zmq::message_t resultset(100);
socket->recv (&resultset);

Person p = Person();
p.ParseFromArray(resultset.data(), resultset.size());
printf("\n Server : %s", p.name().c_str());
15

0mqはmsg。の先頭に文字列トピックを期待するため、0mqのPUB/SUBがprotobufで動作するかどうかはわかりませんが、protobufはフィールド記述子を最初に配置します。

実際にはここにソリューションとのリンクがあります。

http://www.dotkam.com/2011/09/09/zeromq-and-google-protocol-buffers/

乾杯

3
jaybny

通信するときは常にシリアル化する必要があります。構造はランダムアクセスです。 ZeroMQのような通信層はシリアルです。

言語に付属する「デフォルトのシリアル化」を使用できます。

たとえば、C++では、ポインターのない構造には、バイト配列に直接変換できる特定のバイナリレイアウトがあります。このバイナリレイアウトは、間接的にはシリアライゼーションレイヤーであり、言語とコンパイラーの両方に固有です。

ポインターがなく、パイプの両端で同じコンパイラーと言語を使用している構造に制限する限り、提供されているデフォルトのレイアウトに加えて追加のシリアル化を行うライブラリーは避けてください。

1
Erik Aronesty