エンコーディングデータとしてはXMLが有名だが、その効率の悪さが問題となる場合も多い。効率の悪さには、エンコーディング/デコーディングが非効率であることと、使用する空間サイズが大きいことの両面がある。これに対して、人気のあるバイナリシリアライゼーションフォーマットには、広く使われているASN.1や、GoogleのProtocolBuffers、FacebookのThriftといったものがある。
そして今、BERTという新しいフォーマットがGitHubのバックエンドを動かしている。BERTはTom Preston-Werner氏によって作られたフォーマットであり、ノード間通信のためにErlang termのエンコードに使われるErlangのExternal Term Format (ETF)に基づいている。
BERTはETFを拡張して、dictionaryやtime、regexなどの複雑なデータ型が使えるようになっている。
また、BERTはASN.1やProtocol Buffersとは違って、フォーマットのスキーマやIDL仕様を必要としない。つまり、BERTはJSONの背景にある考え方のバイナリ版のようなものだ、とTom Preston-Werner氏は説明する。
私はJSONが好きなんです。言語のサブセットを抜き出して、それを使ってプロセス間通信をしやすくするという考え方が大好きなんです。それで、Erlectricityを使ってやった仕事を思い出しました。2年ほど前、私はErlectricityのためのC拡張を書いていました。ErlangのExternal Term Formatのデシリアライゼーションを高速化するためです。
[..] 私は考えたんです。もし、ErlangのExternal Term Formatの汎用的な部分を抜き出して、それをプロセス間通信の標準にしたらどうなるだろうか? もし、ErlangにJavaScriptのJSONに相当するものがあればどうなるだろうか? そして、もし、そのフォーマット上にRPCプロトコルを構築するとどうなるだろうか? そうすると、何が起こるのだろうか、どれだけシンプルになるだろうか?
BERT-RPCは、BERTを使って呼び出しの引数と戻り値をエンコードすることにより、BERT-RPCサーバにホストされているコードをリモートから呼び出すことができる。Tom氏はBERT-RPCの機能について言及している。
- 同期呼び出しと非同期呼び出し [..]
- ストリーミング(要求と応答)
- ディレクティブのキャッシュ
ErnieといったBERT-RPCサーバを使うと、Rubyコードから利用することも可能だ。
BERTとBERT-RPCには仕様書が存在する。そして、RubyとErlangの実装以外にも、JavascriptやPythonといった言語でも、BERTを利用することができる。
あなたはBERTのようなスキーマなしのアプローチの方が好きですか?それとも、ASN.1やProtocol BuffersのようなIDLに基づくアプローチの方が好きですか?