ウェブ華鑑賞: Procol Buffer 編 - steps to phantasien t

TODO: いつか検証する


要調査:

・"The Revenge of RPC: Google Protocol Buffers and Facebook Thrift"

・"Protocol Buffers: Leaky RPC"

・RPC 批判 "Convenience Over Correctness"

・REST 礼賛 "Serendipitous Reuse"

steps to phantasien t(2008-07-24)


Protocol Buffer の話題は一部で熱く語られた...というより炎上していた. ようやく炎がおさまってきたから, 野次馬として現場にかけつけてみたい. 火事と喧嘩はウェブの華.

火元から見ていこう. 熱心な Google ウォッチャーである MS の Dare Obasanjo が, protobuf 公開に合わせすかさず "The Revenge of RPC: Google Protocol Buffers and Facebook Thrift" という記事を書いた. 記事の主張自体は穏当なもの. 「最近一部で バイナリエンコードな RPC が流行ってるみたいだけど, 時代は XML と REST で疎結合じゃなかったの?」と修辞的な疑問を示しつつ, "いや基本的に Web は XML で REST な時代なんだけど, Web に出ない会社の内部ならバージョンやらツールを揃えられるでしょ. それならバイナリと RPC で密結合しちゃって効率を稼いでもいいんだよ."とフォローする内容だった.

Steve Vinoski 登場

ところが obasanjo が記事の中でそれとなく引用した, Steve Vinoski (stevevin) の "Convenience Over Correctness" から火が出た. Steve Vinoski は CORBA ベンダである IONA の元社員で, RPC や分散オブジェクトでは相当痛い目に当ったらしい. 彼の書いた blog や雑誌記事では RPC をボロクソに叩いている. この "Convenience Over Correctness" もその流れを汲む内容. "プログラマは目先の便利さに釣られて関数呼びだしっぽく使える RPC を好むけど, 関数呼びだしじゃないことに気がついた時には手遅れだぜアホどもめ" と戒めている. (誇張あり.)

その stevevin が obasanjo のリンクへ呼応するようにエントリを書いた. これが炎上の現場となる. "Protocol Buffers: Leaky RPC" と題された記事は, まず Protocol Buffer の公開にはしゃぐ Google 社員 Mark Pilgrim を指してこういう. "彼のいうとおり protobuf はバイナリで小さくて良いかもしれない. でも良くみるとこれ RPC が付いてるよ. ダメじゃん!"

先に見たとおり, OSS protobuf に RPC の実装は含まれていない. stevevin もそれは承知している. しかし元 CORBA 関係者にとって, protobuf に含まれるインターフェイスは十分批判の材料になる. (もともと stevevin は "RPC のメタファは完全にウンコ" と主張してるからね. )こんあインターフェイスじゃ, ろくなエラー処理も書けない. 関数の idempotency (冪等性. HTTP の GET みたいなもの) も示せない. キャンセルの API があるけど下回りがキャンセル不能なインフラだったらどうする ... と散々にこき下ろし, protobuf RPC は "leaky abstraction" だと結論する. そして "Google は RPC 部分を消しちゃった方がよくね?" と記事を締め括っている.

挑発的な内容にさっそくコメント欄が引火する. "偉大なる Google 様は社内で protobuf を常用してらっしゃる. 貴様のような輩が検索語をタイプする裏では protobuf のメッセージが飛び交っているというに何たる狼藉であるか馬鹿者! 主は COM も知らんのか?" と煽ったり (CORBA に私怨があるとしか思えない相手へ COM を引き合いに出す辺りに煽りの素質を感じる.) "完全にウンコってなんですか? よくわかりません><" とからかったり, "RPC だって非同期くらいあるからね. Thrift とか Rabbit AMQP とかを読むと良いと思うよ?" と無邪気に提案してみたり. (stevevin は CORBA を始めとする通信ミドルウェアの専門家で, AMQP の標準化と実装にも噛んでいる.)

stevevin も大人気なくいちいち返事をしていく. "Google のどこで RPC が使われてるんですかー?おしてくださーい" "何年も前から証拠は上がっているのに, お前こそ RPC がウンコ <でない> と思うなんて正気?" "素人はこのサイトを全部読んでから出直してこい. AMQP くらい知ってるわアホ" という具合. (誇張あり.) 典型的な炎上のシナリオだ.

社員参戦

stevevin のベタな対応に薄笑いを浮べながら読み進める読者は, しかしここで彼の真の実力 -- 釣り能力 -- の高さを思い知ることになる.

なんと GoogleOSS protobuf 担当 Kenton Varda が現れたのだ.

"protobuf の RPC は社内でめっちゃ使ってますよ. RPC の実装はリリースに入れられなかったけど, あるにはあるんすよ. 依存しちゃってるんで消すのは無理っすwww エラーも戻り値で返せは大丈夫です. たとえば..." とわざわざサンプルコードを示してくれる. さすが社員. そして idempotency は特に役に立つ場面が見当らない. シンプルさのためにマイナー機能は入れないようにしている, 例外もそう. キャンセルの実装はクライアントローカルに閉じたもので, 下回りは関係ない... などと実情を明かし, "RPC が万能じゃないのは認めるけど, 使い所はけっこうありますよ. そんじゃ" とまっとうな感じで締める.

これに対し, stevevin は "idempotent は CORBA より昔からある重要な概念でしょうよ" とか, 呼び出し先の例外じゃなくてシステムの例外もあるでしょうと反論. 外野も再び騒ぎだし, 混迷は深まっていく. "RFC707 読んだけど RPC がよくわかりません><" "たしかに他所のミドルウェアには idempotent あるねえ." "CORBA 標準化委員から飛んで来ました. idempotent はトランザクションの実装が必須になるので, 標準からは drop したはずです." "いやトランザクション要らないでしょ" "書いたもの全部読めって横柄じゃね? Google 社員は親切だったのに..." "15 年の経験を一言で言えって方が横柄だよ" "RFC 難しいってのは確かだけど, みんな使ってるんだから有用性は明らかじゃん" "いや深い考えなしにテクノロジーを採用するなんてよくあることじゃん" (元ミドルウェア屋が言うと身も蓋もないなー...)

そして stevevin が, "そもそも Google の RPC 実装は見られないんだから, 出ている範囲で判断するしかないじゃん. そりゃ非公開の API があって上で言ったような問題を解決できるかもしれないけど..." と愚痴たところで, ふたたび 社員 kenton が登場. 役目をわきまえている.

"protobuf の API にあるのは最低限の必須インターフェイスだけで, 各実装は独自の API があるんすよ. たとえば timeout を指定するなら SetTimeout() があればいいけど, 実際あります.そんなかんじで色々実装すれば OK."


ZeroC の CTO, Michi Henning が参戦してきたのだ. おお, 俄然盛り上がってきた! (野次馬的には.)

stevevin と同じく, michi も元 CORBA ベンダのエンジニアだ. CORBA 屋をやめてミドルウェアと無関係のスタートアップに移った stevevin に対し, michi は (これも小さな企業である) ZeroC で, 打倒 CORBA を目指す高速な分散オブジェクトシステム ICE を開発している. michi は "The Rise and Fall of CORBA" という記事を書くようなアンチ CORBA 派. しかし ICE を見ればわかるように, 分散オブジェクト自体を諦めてはいない. 対する stevevin は "RPC はウンコ" と罵り, 分散オブジェクト自体を捨てている. (ちなみに今は REST がお気に入りらしい.)

ところでこの二人, まったくの他人ではない. まだ CORBA の世界にいたところ, 彼らは Advanced CORBA Programming with C++ という CORBA の専門書を共著している. いわば僚友だ. しかし時は流れた. 理想論を捨てられない michi の青さに苛立つ stevevin と, ダークサイトに堕ちた stevevin に憤る michi.

michi: "なぜだ? なぜ裏切ったスティーブ!? 分散透過の原則をあれほど愛した君が...

確かに CORBA は失敗した! でもたった...たったそれだけで諦めたのか?

RFC707 を踏み躙るとは! 僕は君を許さない!!"

stevevin: "わかってないのはお前の方だよミッチー... CORBA だけじゃない,

EJB, SOAP, あらゆる分散オブジェクトが現れては消えていった.

参照透過こそが幻想なんだよ. さあ, 剣を抜け! 決着を付けてやる!!"

というかんじで, 袂をわけた二人がいま対峙している! (誇張あり.) 野次馬としては勝手に盛り上がらざるを得ない.