Protocol Bufferまとめ

グーグル、XMLに代わるデータ交換ツール「Protocol Buffers」をオープンソース化:ニュース - CNET Japan

 Googleは米国時間7月7日、データ交換フォーマット「Protocol Buffers」のオープンソースプロジェクトを立ち上げたと発表した。

 Protocol Buffersの目的は、サーバ間で多様なフォーマットのデータを高速で共有する際の問題を解決することだ。Protocol Buffersはまた、Googleのような企業が、接続されたサーバのネットワーク上で、一時的なダウンを招くことなくソフトウェアをアップグレードできるよう設計されている。

 Googleは当初、XMLを共通言語として利用し、異なるサーバ間でデータをやり取りする考えだった。だが、XMLを使った作業は複雑になる場合がある。さらに重大な問題として、XMLで作成された大容量のファイルは、アプリケーションのパフォーマンスを低下させる可能性がある。

 Protocol Buffersは、XMLの代替手段として、ネットワーク上でやりとりされるデータ形式や、ハードディスクに保存されるデータ形式を記述するものになる。 GoogleのソフトウェアエンジニアリングチームのKenton Varda氏によると、Protocol BuffersはXMLと異なり、コンパクトなフォーマットで、簡単に利用できるよう設計されているという。

 Varda氏は、Googleオープンソースプロジェクトなどを扱うブログに、次のように書いている。

 「Protocol Buffersを利用すれば、特別な定義言語でシンプルなデータ構造を定義してから、コンパイルして、データ構造を表すクラスを好みの言語で作成できる。これらのクラスは、十分に最適化されたコードを使用して、極めてコンパクトなフォーマットでメッセージの構文解析シリアライズができる。何にも増して、これらのクラスは簡単に使える。各フィールドには、シンプルなget(取得)とset(設定)のメソッドがある。準備ができたら、1回メソッドを呼び出すだけで、全体をシリアライズしてバイト配列や入出力ストリームにする(または、バイト配列や入出力ストリームから構造解析する)ことができる」

 Googleのウェブスパムチームを率いるソフトウェアエンジニアのMatt Cutts氏は7月7日夜、Protocol Buffersは自動的にJavaPythonC++のコードを生成するとブログに書いている。

 「バイナリフォーマットでデータをエンコードする、非常にコンパクトなツールとしてProtocol Buffersを考えてほしい。プログラマープロトコルや構造化されたデータをシンプルに記述すると、Googleのコードが、C++JavaPythonでクラスを自動作成し、プロトコルの読み書きや構文解析を行ってくれる。プロトコルの緩衝物(protocol buffer)があれば、ディスクに書き込んだり、ネットワーク経由で送ったり、面白いことをいくらでもできる。どんな中規模企業も(それに、かなり多くの新興企業も)Protocol Buffersが非常に便利であることに気づくはずだ」


Protocol Buffer - お題目うぉっち

Googleへの1回の検索の裏では100台以上のサーバーでプログラムが走り、データそのものは数百万台のサーバーに記録されていることは有名だが、通信にかかるタイムラグというのは意外に大きい。そんなに何台ものサーバーが連携して動く場合には、データの通信とその準備にかかる時間だけでも思わぬ長さになったりするものだ。

ところで、SOAPなんかは異言語のシステム間でもデータ連携ができるように、各言語の型の違いを吸収するという役割も果たしているが、このプロトコルはどうなっているのだろう?おそらくはオブジェクトをそのままシリアライズして送るようなものなのではないかと思うのだが、それだとデータ交換相手を多少選ぶことになってしまう。

そこもうまく仕組みが用意されているようなものだとしたら、イマイチ普及している感がないSOAPにトドメをさす存在になるのかな?なんて思った。

・要調査

・こちらに使いかたの例がありました。

Protocol Buffers 使ってみた - Twisted Mind

Python でお試し編

$ protoc -I=. --python_out=. addressbook.proto
$ ipython -cl
>>> import addressbook_pb2
>>> person = addressbook_pb2.Person()
>>> person.id = 1234
>>> person.name = "僕の名前はヒゲです"
>>> person.email = "hige@example.com"
>>> phone = person.phone.add()
>>> phone.number = "555-4321"
>>> phone.type = addressbook_pb2.Person.HOME

シリアライズ/デシリアライズ

>>> person.SerializeToString()
'\n\x1b\xe5\x83\x95\xe3\x81\xae\xe5\x90\x8d\xe5\x89\x8d\xe3\x81\xaf\xe3\x83\x92\xe3\x82\xb2\xe3\x81\xa7\xe3\x81\x99\x10\xd2\t\x1a\x10hige@example.com"\x0c\n\x08555-4321\x10\x01'
>>> tmp = addressbook_pb2.Person()
>>> tmp.ParseFromString('\n\x1b\xe5\x83\x95\xe3\x81\xae\xe5\x90\x8d\xe5\x89\x8d\xe3\x81\xaf\xe3\x83\x92\xe3\x82\xb2\xe3\x81\xa7\xe3\x81\x99\x10\xd2\t\x1a\x10hige@example.com"\x0c\n\x08555-4321\x10\x01')
>>> print tmp.name
僕の名前はヒゲです

Pickle みたいに Python 限定じゃないのが魅力