実は、このブログの下書きは一年ほど前の第一回Hackathonの時点でできていたのですが、本日(2011/4/3)めでたく第三回が開催され、いい機会なのでここで公開することにしました。
シリアライザ・デシリアライザ
Pure Erlangで書きました。大昔に書きなぐったものを掘り起こして復活させました。既にCの実装があるのだからNIFなり何なりで高速化すればいいじゃないというのも少し考えましたが、ポータビリティとメンテナンス性を考えるとベタ書きの方がトータルとしては楽かなぁと思ってこうしています。何よりbinary matchingが素晴らしすぎる(性能計ってみたいんだけど、どーせ遅いのは分かっているんだけど、それはErlangの処理系がそもそも遅いのであってserialization/deserializationが速いかどうか判断できないと思うんだよね。NIFの実装とbinary matchingを比較すればいいのかもしれないけど…)。
APIはmsgpack:pack/1とmsgpack:unpack/1, msgpack:unpack_all/1だけです。デコードに失敗したときは例外を投げます。ストリームベースのインターフェースはありません。失敗したら最初からやり直します。くわしいインターフェースを知りたい人はedocかソースを参照のこと。QuickStartもとりあえず書いてあります。
RPC
正式なレポジトリはこちら。私のレポジトリは実験用に随時更新されて、安定されたりキリのよいところで本家にpush/mergeされます。Erlangなのでクライアントも大体ServerだったりしてServerだとどうなるのとかわけわからんことになりそうですが、クライアントの実装は簡単なのでsrc/sample_client.erlをみてください。サーバーの実装もとても簡単でsrc/sample_srv.erlを見れば、behaviourでテキトーに継承して実装できていることが分かると思います。
出来ていること - 同期RPCのAPIなど(ここまで書いた)
- クライアントからリクエストを出してサーバーで読んでクライアントに返す、というところまでできています。もろもろ失敗したら例外を投げてくれたりします。あとはapplication化、rebar化です。とりあえずrebarのお作法に従っているので、この先eunit,cover,qc,typer,dialyzerなどをやって静的に型解析やテストで安全なことが保証できていったらなというところです。
- 英語化 - 新しいwikiやJIRAが立ち上がったのだけれど、これが文字化けしてなかなか使いにくいので、とりあえず英語標準で行こうかという話になりました。まーどっちでもいっか。
ErlangでできていないこととかTODOとか(これが死ぬほど沢山ある)
- 非同期RPCのAPI(まだ書いてない)
- IDL
- 以前書いた通り、Erlangは処理系が出来過ぎててRPCでやることは余りないのですが、それでもIDLを使って他の言語からも呼び出せることが保証されたコードが生成されるのが嬉しい人もいると思うので、まったり対応できてたらなあと思うところです。仕様が決まってきたのでリファレンス実装待ちです(主体性なし
- 日付・時刻型対応(案7でしたっけね
- 組み込み型例外
- 圧縮サポート
- Transport層で適当に吸収するということになりました。圧縮を待ってない子に圧縮した子がconnectするとどうなるこっちゃら不定といった仕様になったようですが(酔っ払っていてよく覚えていない)、個人的にはSSL on TCPと同じ発想でいくのがよいかなぁと思いました。つまりユーザーが、TCP/UDP/GZonTCP/Snappy_on_TCP/SSL/GZonSSLonTCPとかそーゆーいろんなTransportを各言語でサポートしていたりしていなかったりでテキトーに便利な実装が生き残るでしょうというところでした。
- ここのTransportがきちんとPluggableにできないと、Erlang版のMsgpack-RPCはα版を永久に卒業できません。Erlang風のお作法に従ってなんとかPluggableにつくりたいところです。さあみんな、オラに元気を分けてくれ!!!
その後の議論で@mzpや@nobu_kと@frsyukiが盛り上がってよい仕様になったっぽいので、IDLも期待ですね。Thriftが例によってFacebookクオリティなので期待したいところです。
その他
西澤さんが面白すぎました。あと、遠いにも関わらず来てくれた@mzpにも感謝です!あと主催+会場提供な地獄のCTOと、古橋君もお疲れさまでした。