Google、内部で使用しているデータバッファリング&交換プロトコルをオープンソース化 59
ストーリー by soara
Google版オレプロトコル公開 部門より
Google版オレプロトコル公開 部門より
CNETでも記事が出ている。Googleが、Googleのさまざまなシステムで使用している、データバッファリング&交換プロトコル「Protocol Buffers」をオープンソース化した (PC Worldの記事)。
Googleの内部では、サーバー間で様々なデータが交換されており、さらにそれらのデータはフラットではなく構造化されているそうだ。このようなデータを受け渡すフォーマットとしてXMLがよく使われているが、Googleのデータ共有システムで使用するにはXMLは「コストが高すぎる」ため、Googleは独自のプロトコルを開発したそうだ。
Protocol Buffersを利用することで、さまざまな構造化データをさまざまな言語で容易に扱えるようになり、さらに通信量の削減や通信速度の高速化も期待できる。Googleによると、XMLを利用する場合と比べてデータ量は3~10分の1程度で、さらに速度は20~100倍高速とのことだ。
何に使う? (スコア:2, 興味深い)
大規模な情報共有と、強力な検索機能はP2Pシステムの要ですから、
そのへんに、このプロトコルは使えるんじゃないかな。
Re:何に使う? (スコア:2, 参考になる)
P2Pのデータって動画や音楽などのbinaryデータがほとんどだから、難しいと思うよ。
XMLに代わるデータ交換フォーマットとして、企業でのデータ連携・同期処理などの用途が向いているのでは。
I'm out of my mind, but feel free to leave a comment.
大切なのはメタデータだから (スコア:2, 興味深い)
オーバーレイネットワークの形成と検索なので、
オーバーヘッドの少ない半構造化データの表現には使い道があるかと。
JSONもかなりその用途には使えると思いますが、自己記述性に乏しい。
いや、その自己記述性の乏しさというか、データそのものにスリム化した点がJSONはいいわけですが。
一方あやふやなスキーマじゃいやだってことならがちがちに独自のスキーマでXML書くか、
逆にもっと柔軟にRDFのトリプルで書いていくか・・・結局のところ用途に応じて
乱立するというのはこれからも変わらないんだろうなぁ。
#さぁ、いろんなデータ表現のパーサを再実装する作業に戻るんだ!
屍体メモ [windy.cx]
Re:何に使う? (スコア:1, 興味深い)
データ交換を社内で頻繁に行うような企業では、元々簡単なテキストか独自のフォーマットで行ってきたわけです。
結局、XMLに移行しているのは変換コストは高いけど、社外・社内システム間(XMLを簡単に取り扱える製品が増えた)
でやり取りできる標準性を重視したからです。
この手のデータフォーマットは変換コストよりもそういった汎用性と標準性が選択の基準に重点が移っているので、
敢えてXMLからの更なる移行を検討するような企業はそう多くないと思うんですけどね。
結局Google並みの大規模・大量データがやり取りされるようなシステムくらい?
Re:何に使う? (スコア:1)
あるいは資源に乏しい組み込み機器間の通信システムとか.
Re:何に使う? (スコア:1, 参考になる)
Re: (スコア:0)
Re: (スコア:0)
Re: (スコア:0)
#に限らずJavaプログラムでそういうの多いよね。
Re: (スコア:0)
Re: (スコア:0)
Re: (スコア:0, フレームのもと)
P2Pと聞いてWinnyやShareしか思い浮かばない人は消えて下さいまし。
Re:何に使う? (スコア:1, 参考になる)
Skypeの音声やビデオはテキストにエンコードして通信ですか?
元コメの例の挙げ方は確かに半端だが否定するほどのものでもない
Re: (スコア:0, 荒らし)
http://ja.wikipedia.org/wiki/P2P#.E3.83.95.E3.82.A1.E3.82.A4.E3.83.AB.... [wikipedia.org]
Re:何に使う? (スコア:1, すばらしい洞察)
そのWikipediaの項目にも
> 一方、P2Pとして、WinMXやWinny、Napsterなど、インターネットにつながった
> コンピュータ間で自由に、そしてある程度匿名的にファイルを転送できる機能を
> 持ったファイル共有ソフトによるネットワークを指していう誤用も見受けられる。
と言う記述もあるし
P2Pネットワークで最も一般的に共有されているうんぬんってのは
「ファイル共有ネットワークの法的問題」っていう
ファイル共有ネットワークについてだけに言及した部分だよね?
Re: (スコア:0)
p2pのクエリと結果なんてテーブル一個程度のシンプルなモノだと思うんだけど。
(ライブラリで楽チンする以外ならばcsvの仕事だと思う)
binaryデーターと言うより、ペイロードが大きいからオーバーヘッドが相対的に小さくなるって話だよね?
科学関係のひとも注目しているようです (スコア:2, 参考になる)
「コストが高すぎる」? (スコア:1, おもしろおかしい)
Re:「コストが高すぎる」? (スコア:1, 参考になる)
流行っちゃったから皆仕方なく使ってるけど別に効率が良い訳でも筋が良い訳でもない。データ形式界のWindowsみたいなもんだ。
Re: (スコア:0)
Re:「コストが高すぎる」? (スコア:2, おもしろおかしい)
気にならない人は同一視しても構わない。
Re: (スコア:0)
>気にならない人は同一視しても構わない。
マークパンサーが何か言いたそう [fc2.com]にvn氏をみている!
Re:「コストが高すぎる」? (スコア:1)
Re:「コストが高すぎる」? (スコア:1, 参考になる)
普段デスクトップパソコンを使ってるようなシチュエーションではXML処理にかけているリソースというのはあまり意識しませんが、Googleが行っているような大量のデータをやり取りするような用途では XMLを使うことがボトルネックになってくるのでしょう(そういう用途では、必要なサーバが増えたりなどといった金銭的なコストもかかってくるかも知れません)。
自分が経験した範囲では、携帯電話向けアプリの開発で当初XMLでデータを渡してたのですが、データ量が多くなるとパース処理が重たくて使い物にならないということで急遽簡単なフォーマットに変換して渡すように仕様変更したりとかあります。
#使ってたXMLパーサの品質が悪いからってのもあるんでしょうが、XMLパーサの品質改良には
#それこそコストがかかりそうだったので。
#ネタなのでAC
何がやりたいんだろう? (スコア:1, 興味深い)
ニーズが無いところへの提供・提案だとしたら、
Googleにとっての狙い・メリットは何だろう?
Re:何がやりたいんだろう? (スコア:1)
Re:何がやりたいんだろう? (スコア:1)
ってのはありそうです.
Re: (スコア:0)
(Googleとしては、XMLによるゲートウェイを用意しなくていい)
Re: (スコア:0)
取得済みなのかも。
XMLのコストが高いのはわかるが (スコア:0)
Re: (スコア:0)
君のお腹が一杯になると、何か解決するの?
君の許容量が低いだけ?
恐らく、こういったのはシステム全体を含めた上手い解決策がでるまで、
何回でも何年でもやり続ける作業だと思います。
その解決策が使えるのは、せいぜい数年かもしれませんが…
Re:XMLのコストが高いのはわかるが (スコア:2, すばらしい洞察)
YAML や JSON じゃだめなの? 正直,XDR とか ASN でもいいと思うんだけど…
XML 対 非XML という対比については分かりやすいのだけど,非 XML 同士では流派の
違いというか,審美観の問題になっている気がするです.
Re:XMLのコストが高いのはわかるが (スコア:2, 興味深い)
プロトコルバッファはVariant型でデータ長を持たない可変長の符号化を行ってる点で他のどれよりも短いデータ長になるから、データが1バイトでも短いとスループットが大きく変わるくらい流量の多いシステムではかなりコスト減につながってると思うぜ。
符号化・復号化時の速度低下も小さそうだし、このあたりはうまいね。
他のじゃこうはいかない。どれもデータかライブラリか仕様が太ってる。
Re:XMLのコストが高いのはわかるが (スコア:1)
このエンコード方法だとデータサイズが 7 * 32bit や 7 * 64bit などを超えた段階で「他のどれよりも短いデータ長」と言うのは無理が出てきませんか? 単純に長さの情報 + バイナリ列の方がトータルサイズが短くなってしまいます。
ある程度のサイズになると、同じ方式で「データバイト長を」エンコードして、その後実データをバイナリ列で付加した方が全データ長は短くなるように思えるのですが。
もちろん、データの性格 (流すデータの各フィールド長が短いものがどれだけ多いか等) で総データ長に差が出てくるので、小さいデータが大半を占める場合にはトータルで短くなると思いますが。
Re:XMLのコストが高いのはわかるが (スコア:1)
そもそも64ビットを超えません。ただ「どれよりもは」ちょっと言いすぎだったかもね。サイズの面ではASN.1のPERではメッセージの定義しだいで一長一短だし。
でも速度サイズ比ではプロトコルバッファが優勢じゃないかな。サイズでASN.1 PERが勝つ場合はビット操作の回数がかなり多そうだ。
Re: (スコア:0)
Varintな
XMLもコンパイルなり前処理して受け渡しすれば軽くもなりそうだが…
Re: (スコア:0)
Re:XMLのコストが高いのはわかるが (スコア:1, 参考になる)
To understand your simple protocol buffer encoding, you first need to understand varints. Varints are a method of serializing integers using one or more bytes. Smaller numbers take a smaller number of bytes. [google.com]
まとめとくと
Re:XMLのコストが高いのはわかるが (スコア:2, 参考になる)
Protocol buffers は拡張性を持った方法でデータを小さく高速に符号化するための方式です。 YAML [yaml.org] の目的は拡張性と可読性、 JSON [ietf.org] の目的は JavaScript の式として解釈できることで、どちらも目的が違います。端的な違いとして、 YAML や JSON では符号化後のデータがテキストですが、 protocol buffers では符号化後のデータがバイナリーです。
XDR とか ASN.1 とかは名前しか知りません。誰か protocol buffers がこれらと比較してどうなのか教えてください。
Re:XMLのコストが高いのはわかるが (スコア:1, 参考になる)
どちらもCで使われるデータ構造(struct含む)に毛が生えたようなものをそのままシリアライズしているので、
スキーマが存在しません。
それでだめだったんでしょう。
Re:XMLのコストが高いのはわかるが (スコア:1)
もしよければ、「スキーマが存在しないので駄目」というのをもう少し詳しく教えてもらえないでしょうか。
protocol buffers は、プログラムのバージョンが上がって新しい形式のデータと古い形式のデータを話すプログラムが混在しても大丈夫なように設計されているようです。 XDR や ASN.1 はそうなっていないという意味でしょうか。
Re:XMLのコストが高いのはわかるが (スコア:1)
説明ありがとうございます。よくわかりました。スキーマと聞いてフィールド名や型の情報を連想してしまい、そんなの protocol buffers でも送信されないよなあ、もしかして .proto ファイルのことか? などと少し混乱しかけていました。
たしかにそうですね。
今までも小型で高性能で拡張性のあるシリアライズ方式が必要な場面ではあちこちで似たようなシリアライズ方式が考案されコードが書かれてきたのでしょうから、 protocol buffers の方式とコードが公開されてすぐに何かに活用されるかどうかはわかりませんが、方式やコードを自前で用意する代わりに公開されているものを採用するという選択肢が増えるのは良いことだと思います。
Re:XMLのコストが高いのはわかるが (スコア:1)
これではフィールドが変更されると互換性がなくなるでしょう。
ASN.1では抽象構文自体にメッセージの将来的拡張の可能性を明記するので、拡張後のデコーダなら拡張前とはデータに互換性があり、逆の場合は非互換です。
> protocol buffersではすべてのデータにはフィールド番号がついていますので、
フィールドが変更されても「知らないフィールドは素通しする」で互換性は取れると思います。
プロトコルバッファのプロトコル定義構文からはフィールド番号を指定できないので、メッセージ中の追加フィールド挿入位置により、それより後ろの既存フィールドのフィールド番号が必ずずれると考えていいので、フィールド番号は互換性維持に使えないと思っていいんじゃないかな。メッセージ番号が存在しないのでフィールド番号はどのメッセージのデータかを判別するために使用する物だと思うよ。
(公開されているジェネレータを使わずにエンコードだけ借りるなら話は別だけど)
Re:XMLのコストが高いのはわかるが (スコア:1)
protocol buffers のドキュメントを斜め読みしてみました。
何か誤解しているように思います。 .proto ファイルの language guide [google.com] によれば、 .proto ファイルでは各フィールドに明示的にタグ (メッセージ中のフィールドを識別する番号) を指定します。 #1383160 [srad.jp] の人が「フィールド番号」と呼んでいるものは protocol buffers のタグと同一だと思います。デコーダーは符号化されたデータの中のタグを見て、自分の知らないタグが付いたフィールドをスキップするようで、これによって将来フィールドが追加された場合に新しいデータを古いデコーダーに読ませても大丈夫になっているようです。
また、 protocol buffers のタグは一つのメッセージの中でしか一意でないので、タグを見てメッセージを判別することはできません。デコーダーを呼び出す前に、これから復号しようとするメッセージの型を知っている必要があります。
Re: (スコア:0, おもしろおかしい)
ホントにそれが目的?
そうか!JavaScript なら eval すればオブジェクトのデコードができるものね。
すごいねっ
Re:XMLのコストが高いのはわかるが (スコア:2, すばらしい洞察)
はい。
まあ、 JavaScript はスクリプト言語なので、それくらいのことはできて当然というのが僕の印象ですが……。
Re: (スコア:0)
Re: (スコア:0)
設問が難問なほど、皮肉ってのは生きるものだよ?
Re:eval (スコア:2, 興味深い)
信頼できないデータを eval するのはセキュリティー上問題があるというのはもちろんですが、僕の元コメント (#1382507) [srad.jp] に対する批判としては的外れです。 #1382507 では、リンクを張った RFC 4627 の 1 節にも書いてある「JSON の design goal は JavaScript のサブセットにすること」という事実を書いただけなので。ただ、 design goal を「目的」と訳したのは不適切だったかもしれません。
RFC 4627 の 1 節より:
また、 RFC 4627 の 6 節を読めば JSON の設計において eval を使って復号できることが意図されていることがわかります。
個人的な好みを書けば、僕は eval が嫌いなので、データが信頼できてもできなくても eval で復号するのは嫌いです。また、信頼できないデータについては、 6 節に書いてあるようなテストで JavaScript の将来のバージョンにわたって安全性が保証されるとも思えませんし。
Re:eval (スコア:1)
誤解です。 #1382507 [srad.jp] の書き方が少しわかりにくかったのは認めます。 #1382507 の
の部分を以下のように訂正すれば満足していただけるでしょうか。
でも、 #1382507 の当該部分が #1382417 [srad.jp] の
を受けて書かれていることは理解可能だと思うので、多少わかりにくかったという事実を前提としても、なぜこれほどまで誤解されるのか、よくわからなかったりします。