Protocol Buffersはデータ構造をシリアライズする技術になります。いわゆるXMLやJSONみたいなものではありますが、バイナリ形式なので「サイズが小さい」「シリアライズ、デシリアライズが高速」でprotoファイルによってメッセージ定義を「シンプルに記述可能」なのが売りです。またメッセージ定義はプログラムにコンパイルされるため、プログラムから利用しやすいのも利点です。

ということで今回はProtocol Buffersを触ってみました。

ダウンロード&インストール

以下のリンクで各言語のパッケージをダウンロードします。今回はPythonを使うので、protobuf-python-3.0.0.zipをダウンロードします。

Release Protocol Buffers v3.0.0 · google/protobuf

まずはコンパイラのprotocコマンドをビルド&インストール

Protocol Buffersを使ってプログラムを記述

Python用のライブラリをインストール

.protoファイルからソースコードをコンパイル

addressbook.protoはこんな感じで(proto3にしているのはRubyで利用するため)

Pythonスクリプトからは以下のようにして利用します。

出力結果はバイナリなのでxxdコマンドなどで確認可能です。

https://github.com/google/protobuf/tree/master/ruby

Rubyスクリプトはこんな感じで

あとはPythonの出力をRubyの入力に食わせるだけ

こんな感じで、同一のメッセージ定義からそれぞれの言語でコンパイルして、異なる言語間でメッセージをやり取りすることが出来ました。今回は同一ホストの入出力を使いましたが、異なるホスト間でネットワークを介してAPIでメッセージ交換をすることも可能ですし、有用そうです。

実際どれくらいサイズメリット、速度メリットがあるのか

以下のJSONで記述可能な構造体に対して確認してみました。

まずはサイズメリット

2倍以上差がつきました。

性能差に関しては以下のスクリプトで検証しました。

出力結果はこんな感じで、2倍くらいの性能差が出ています。

参考URL