😎

Cap'n Protoを勉強してみる(1)

2022/03/27に公開

Cap'n Protoとはなにか?[1][2]

  • gRPCのようなRPC(Remote Procedure Call)のフレームワークの一つ
  • IDLでメッセージ(データ構造やAPI)を定義できる
  • IDLから様々な言語(C++,Rust)のコードを自動生成できる
  • データをシリアライズするためのメカニズムを有している

ざっくりいうと、IDLでクライアント・サーバー通信のAPIを書いてIDLコンパイラで各言語のクライアントとサーバーの実装を生成して、生成されたコード上の関数を呼ぶ出すことで通信ができる。

gRPCとの違い

gRPCで使用しているProtocol Buffersに比べて早い。作成者のKenton VardaさんはGoogleがオープンソースで公開したProtocol Buffers Ver2の主要な作者でした。
長年の経験とユーザーからのフィードバックを糧に、どうすればより良くできるかを考えた結果、Cap'n Protoは生まれたようです。[3]

優れているところは?[4]

  • Incremental reads:Cap'n Protoのメッセージをすべて受信する前に処理を開始することは容易です。これは、外側のオブジェクトが完全に内側のオブジェクトの前にあるため。 (多くのエンコーディングでは、外側のオブジェクトが内側のオブジェクトを包含しているのとは対照的です)。

  • Random access: メッセージ全体を解析することなく、メッセージの1フィールドだけを読み取ることができる。

  • mmap:大きなCap'n Protoファイルでもメモリマッピングして読み込む。OSはアクセスしない部分は読み込まない。

  • Inter-language communication:JavaやPythonからC++のコードを呼び出すのは、面倒だったり遅かったりしがちです。Cap'n Protoを使えば、2つの言語が同じインメモリデータ構造で簡単に操作できるようになります。

  • Inter-process communication: 同一マシン上で動作する複数のプロセスが、共有メモリを介してCap'n Protoのメッセージを共有することができます。カーネルを経由したデータパイプは不要。他のプロセスを呼び出すのも、他のスレッドを呼び出すのと同じように高速で簡単です。

  • Arena allocation:Protobufオブジェクトの操作は、オブジェクトの再利用によほど注意しない限り、メモリ割り当てによって停滞する傾向があります。Cap'n Protoオブジェクトは常に「アリーナ」または「リージョン」スタイルで割り当てられ、より速く、キャッシュローカリティを促進します。

  • Tiny generated code:Protobufはメッセージタイプごとに専用の解析およびシリアライゼーションコードを生成し、このコードは巨大になる傾向があります。Cap'n Protoの生成するコードは、1桁以上小さくなっています。実際、通常はいくつかのインラインアクセッサメソッドに過ぎません。

  • Tiny runtime library: Cap'n Protoのフォーマットがシンプルなため、ランタイムライブラリは非常に小さくなります。

  • Time-traveling RPC: Cap'n ProtoのRPCシステムは、タイムトラベルを実装しており、サーバーにリクエストが到着する前に、クライアントにコール結果が返されます。

Time-traveling RPC[5]

Cap'n Proto RPCはTIME TRAVELを採用しています! RPCコールの結果は、サーバーが最初のリクエストを受け取る前に、即座にクライアントに返されるのです!

といっても、本当にタイムトラベルするわけではなくPromiseに対応しているというのが正しいようです。例えば、図のように foo() を呼び出し、その結果に対して bar() を呼び出したい場合、つまり bar(foo()) を呼び出したいとします。従来のRPCでは一回ずつメッセージの処理を行う必要がありましたが、「foo() を実行してください」というメッセージと、「最初の呼び出しの結果に対して bar() を実行してください」というように一緒に送信することができるようになります。従来では呼び出しをまとめるためにfoo_and_bar()のような一まとめにするような別メッセージを作って効率化を図っていたようです。

脚注
  1. Wikipedia:Cap'n Proto ↩︎

  2. 本家サイト:Cap'n Proto ↩︎

  3. 本家サイト:Cap'n Protoの"Why do you pick on Protocol Buffers so much?" ↩︎

  4. 本家サイト:Cap'n Protoの"Are there other advantages?" ↩︎

  5. 本家サイト:RPC Protocol ↩︎

Discussion