高速メッセージングシステムMessagePack - 楽天テクノロジーカンファレンス2010

もはや先月のことですが、楽天テクノロジーカンファレンス2010で発表してきました。
MessagePackについて、かなり詳しく紹介しています。


Ustream.tvの録画はこちら

MessagePackの概要(7ページ目〜)

MessagePack は、It's like JSON, but very fast and small. のフレーズの通り、「JSONみたいに使えるけど速くて小さい」シリアライズ形式です。
JSONがテキスト形式のシリアライズフォーマットであるのに対し、MessagePackは様々な工夫を取り入れたバイナリ形式のシリアライズフォーマットです。


MessagePack-RPC は、MessagePackをプロトコルに使ったRPCシステムです。多言語で利用することができ、RailsのアプリとJavaのシステムを繋げる、JavaのシステムからC++のサーバを呼び出すといった、異種言語間の通信を可能にします。kumofsのI/Oシステムから由来した設計で、高い並列性を発揮します。また、コネクションプーリングや非同期呼び出しなどをサポートし、非常に高機能であると同時に、FutureやSessionなどのコンセプトに裏打ちされた使い勝手の良いAPIを提供します。

MessagePackプロジェクトの成り立ち(13ページ目〜)

新しい分散システムを作るには、プロトコルの実装が必要になります。特に V-FIELDCagraKastor のようなストレージシステムでは、通信のオーバーヘッドが性能に直接影響してくるため、プロトコルの実装も手を抜くわけにはいきません。しかし、プロトコルの実装は非常に面倒です。
通信の問題が解決されれば、スケールアウトの恩恵を受けられるネットワークアプリケーションを、簡単に実装できる様になります。並列性や耐障害性など、本質的なシステムの設計に集中することができます。


また、CPU負荷やメモリ容量がボトルネックになるシステムの場合、サーバはC++で書きたくなります。しかし、効率的に管理タスクを自動化するには、管理ツールはC++よりもRubyなどの言語で実装したくなります。


そこで、様々なシステムの実装に使えるような汎用性があり、かつ多言語で使えるRPCシステムが欲しくなります。これが MessagePack の開発を始めたきっかけです。
MessagePackは最初に kumofs に実装し、後にこれを切り出してオープンソース化しました。

詳解MessagePack-RPC(19ページ目〜)

MessagePack-RPCは、Request, Response, Notify の3種類のメッセージだけからなる、シンプルなプロトコルです。
Request と Response にはメッセージIDが含まれており、これを対応づけることで、クライアント側でRPC要求とRPC応答を紐付けます。まずこれによって Parallel Pipeliningという並列性を高める機能を実現します。

I/Oアーキテクチャ(26ページ目〜)

I/Oアーキテクチャは、イベント駆動型になっています。サーバ側の実装をイベント駆動I/Oで実装するのはよくある構成ですが、MessagePack-RPCではクライアント側でもイベント駆動I/Oを採用しています。


まず、複数のクライアントインスタンスを一つのイベントループに載せることが可能です。これによって、スレッドプログラミングをすることなく、複数のサーバと同時に通信するアプリケーションを書くことができます。
また、サーバとクライアントの実装アーキテクチャが同じであることから、一つのイベントループ上にサーバとクライアントの両方を載せることが可能です。これによって、サーバとクライアントの両方の性質を持つアプリケーション、すなわちサーバ同士が通信するクラスタアプリケーションを簡単に実装することができます。


さらに、イベントループには、MessagePack-RPC以外のプロトコルを扱うイベントハンドラや、タイマーやシグナルのハンドラも載せることができます。これにより、HTTPとMessagePack-RPCの両方に対応したアプリケーションや、kumo-gatewayのようなプロトコルを変換するゲートウェイサーバを簡単に実装することができます。
先日リリースしたMessagePack-RPC Java版では、イベントループに JBoss XNIO を使っています。

FutureとSession(35ページ目〜)

イベント駆動型I/Oを駆使するプログラムは複雑になりがちですが、MessagePack-RPCでは、これをFutureという概念で扱うことによって隠蔽します。
また、Sessionは、コネクションの概念を隠蔽します。コネクションの確立、接続維持、再接続は、MessagePack-RPCのライブラリ内で自動的に行うため、面倒なコードを一切記述することなく、コネクションプーリングなどの高度な機能を利用することが可能です。

MessagePackの未来(64ページ目〜)

MessagePackは、Sedue Search CloudAmebaなうなどで既に利用されています。
コミッタには海外の開発者も含まれており、開発は非常に活発です。


「学生」「余暇の時間に」といったオープンソースの "瞬発力" や "斬新さ" を取り入れるには、MessagePackプロジェクトが「魅力的」である必要があるだろうと考えています。
また一方で、「システムの開発に」「製品に」といった "持続力" や "堅牢さ" を取り入れるためには、「有用」である必要があるだろうと思います。
この両方を実現していくには、コミッタの力が欠かせません。ぜひ開発者にエールを送っていただければ幸いです。
# 開発者はTwitterMessagePack OR msgpack と検索すると見つかります^^;


The MessagePack Project


MessagePackについてもっと詳しく知りたい方は、gumiStudy#7 でお会いしましょう^^;