迅速なサーバー開発をサポートするRPCフレームワーク

ふと閃いたネタ。
JavaSeasar2を使ってアジャイルなWeb開発」などと言われるように、開発の効率化はライブラリやフレームワークに依るところが大きい。Rubyは言語自体も生産性が高いと思うが、Web開発を効率化しているのはRailsに依るところが大きいに違いない。
Perlはその言語仕様を活用して様々なプログラミングモデルを実現しているが、C++もtemplateという強力なメタプログラミング・リフレクション*1機能を持つ。これを活用してRailsのようなフレームワークを構築できるのではないか。


とはいえ、気を抜くとすぐにSEGVで落ちるような言語を使ってWebアプリケーションを書く気にはならない。しかし、たくさんの機能は必要なくて、単純な機能を高速に実行したいような用途では、C++も十分選択肢に入る。C++はなにより速い。そうなると、C++で書くプログラムと言えば大方サーバーになる。
そんなわけで、C++でサーバーを書くためのフレームワークがあるといいんじゃないか。


最近思うに、サーバーを書くとき、イベントループが既に実装してあると非常に楽に書ける。つまりIOアーキテクチャプロトコルが既に実装してあって、あとはプロトコルに対応するイベントハンドラになる関数を書いていくだけ。そこまでお膳立てしてあればC++でもサーバーはサクサク書ける。
動くようになった後は、gdb、valgrind、google-perftoolsなどなど、大昔から蓄積されてきた資産を全部使えるという利点を活かしてガッツリとチューニングができて楽しい。メモリも直接いじれる。何の制約もオーバーヘッドもなくシステムコールを呼び出せる。極限的に高速なプログラムを生み出せる。


そこで、汎用的なイベントループ、RPCフレームワークを作れないか。プロトコルにはMessagePackやProtocol Buffersなどの汎用的なものを使うか、プラガブルならなお良い。
Railsのgenerateコマンドよろしく、ファイルを規定の場所に置けばMakefile.amやconfigure.inが自動生成されるとか。

src/
src/model/
src/model/tokyocabinet.cc
src/controller/
src/controller/get.cc
src/controller/set.cc
src/controller/delete.cc
src/controller/http-get.cc
src/controller/http-post.cc


RPCとなると基本的にはメッセージ指向のプロトコルになる。しかしそこはJava Servletのインタフェースを参考に、イベントハンドラの引数にストリームを渡すことで、ストリーム指向のプロトコルにも対応できるのではないか:

void Server::Get(proto::Get& args, InputStream request&, OutputStream& response);

ストリームを使うとブロッキングIOになるので、スレッドベースのIOアーキテクチャになる…と思いきや、スレッドを多めにしたWavyアーキテクチャを使えば問題なく捌けると思う。


誰か実装してないかな。とりあえずアイディアだけ。

*1:templateはリフレクションなのか?という話。WikiPediaによれば実行時に限定されるようなので、C++のtemplateはリフレクションとは違う