Vert.xのアーキテクチャ

Vert.xJVM版のnode.jsとして紹介されることが多いのですが、実際はnode.jsよりもやや複雑なアーキテクチャになっています。

f:id:takezoe:20151007021637p:plain

node.jsはシングルスレッド×ノンブロッキングI/Oで並列化を行います。そのためどこかの処理でブロックしてしまうとアプリケーション全体が止まってしまいます。これを避けるには複数のプロセスを立ち上げておけばいいじゃん、というのが基本的なスタンスです(最近はnode.jsアプリケーションをマルチスレッド化するJXcoreというものも出てきていますが)。

これに対してVert.xはマルチスレッド×ノンブロッキングI/Oという構成になっており、ブロッキング処理はイベントループを持たないVerticleに逃がすこともできるようになっています。また、Verticle間ではイベントバスを通じて非同期メッセージングが可能になっています。Vert.xをクラスタリングするとこのイベントバスを複数のVert.xインスタンスで共有することができます。

イベントバスを使用したメッセージングにはJMSなどと同様、Point to PointモデルとPublish/Subscribeモデルの2種類があり、それぞれ特定のVerticle、複数のVerticleに通知を行うことができます。Point to Pointモデルの場合、同じイベント名に複数イベントハンドラが登録されているとVert.xはそのうちの1つをラウンドロビンで選択してメッセージを送信します。そのため複数のVert.xインスタンスで同じイベントにイベントハンドラを登録しておくことで負荷分散のためにPoint to Pointメッセージを使用することもできます。

また、イベントバスにはWebSocketを通じてクライアントサイドJavaScriptとメッセージのやり取りを行うためのアダプタが用意されており、サーバサイドと同じAPIを使用してクライアント/サーバ間で透過的に非同期メッセージングを行うことが可能です。クライアントサイドJavaScriptからVerticleを呼び出したり、サーバサイドのVerticleからクライアントサイドJavaScriptに通知を行ったりということが簡単にできるわけです。

もう1つ、Vert.xの特徴といえるのが、マルチランゲージ対応という点です。Vert.xはJVM上で動作するソリューションですが、Javaだけでなく、RubyPythonJavaScript、Groovy、ClojureScalaといった言語でアプリケーションを記述することができます。これは様々な言語の処理系が実装されているJVMならではのメリットと言えるでしょう。

このようになかなか面白いアーキテクチャを持つVert.xですが、いかんせん流行っている気配がまったくないのが残念なところです。個人的にはもう少し注目されてもいいような気がするのですが…。

f:id:takezoe:20151007021647j:plain