Vert.xは次世代の非同期でスケーラブルな並列処理アプリケーションのためのフレームワークでありJVM上で動作する。Node.jsの代わりになり得るフレームワークだ。開発者はJavaScript、Ruby、Groovy、Javaを使ってこのフレームワーク向けのアプリケーションを作れる。これらの言語を混ぜ合わせて使うことも可能だ。
下記はvert.x上で動作するウェブサーバが静的なファイルを提供する場合のコードだ。
// JavaScript load('vertx.js') vertx.createHttpServer().requestHandler(function(req) { var file = req.path === '/' ? 'index.html' : req.path; req.response.sendFile('webroot/' + file); }).listen(8080) # Ruby require "vertx" Vertx::HttpServer.new.request_handler do |req| file = req.uri == "/" ? "index.html" : req.uri req.response.send_file "webroot/#{file}" end.listen(8080) // Groovy vertx.createHttpServer().requestHandler { req -> def file = req.uri == "/" ? "index.html" : req.uri req.response.sendFile "webroot/$file" }.listen(8080) // Java import org.vertx.java.core.Handler; import org.vertx.java.core.http.HttpServerRequest; import org.vertx.java.deploy.Verticle; public class Server extends Verticle { public void start() { vertx.createHttpServer().requestHandler(new Handler() { public void handle(HttpServerRequest req) { String file = req.path.equals("/") ? "index.html" : req.path; req.response.sendFile("webroot/" + file); } }).listen(8080); } }
ひとつのvert.xのインスタンスは少数のスレッドを管理する。各スレッドにはイベントループが実装されている。vert.xのアプリケーションインスタンス(verticleと呼ばれる)が配置されると、サーバーはそのアプリケーションインスタンスに割り当てるイベントループを選択する。その後のアプリケーションの処理はその選ばれたスレッドが行う。同時に多くのverticleが動作する可能性があるので、ひとつのイベントループには同時に複数のverticleが割り当てられる。
verticleは同じvert.x上で動作しているアプリケーションや他のvert.x上で動作しているアプリケーションとイベントバスを使ってメッセージ通信ができる。これはErlangのアクターモデルに似ている。このメッセージパッシングの仕組みを使えば、アプリケーション上でマルチスレッドのコードを書かなくても、複数のvert.x上でシステムをスケールアウトできる。
イベントバスは分散されてサーバだけでなく、クライアント側のJavaScriptからも利用できる。
並列処理とメッセージパッシング以外にvert.xには下記のような機能がある。
- TCP/SSLサーバとクライアント
- HTTP/HTTPSサーバとクライアント
- WebSockets/SockJSサポート
InfoQはVMWareのシニアスタッフエンジニアであるTim Fox氏にvert.xについて話を聞いた。
InfoQ: vert.xのアーキテクチャについて教えてください。どのように構築されているのでしょうか。
Tim: vert.xの中核はJavaで書かれています。その上に各JVM言語向けに薄いAPIを被せています。なので各言語はそれぞれの言語固有のAPIがあります。JavaのAPIは各言語には直接公開していません。RubyユーザはRubyのやり方で、JSのユーザはJSのやり方で利用できるようにするためです。
InfoQ: vert.xを使う場合、開発者はどのようにすればいいのでしょうか。Node.jsを使う場合と比べてどのような違いがありますか。
Node.jsとほとんど同じだと思います。実際の作業はローカルで動かすかクラウドで動かすかで違いますが、vert.x固有の作業はありません。
InfoQ: JVMとNode.jsでリアルタイムアプリケーションを走らせる場場合、デバッグや監視、運用の点からどうような違いがありますか。
監視や運用はvert.xそのものよりも、vert.xを動かす環境に関係します。例えば、vert.xをクラウドに配置する場合、クラウドプロバイダーが監視を提供しているかもしれません。コミュニティのメンバはOpenShiftとHerokuではVert.xを動かせます。CloudFoundryももうすぐサポートしてくれるといいのですが。
InfoQ: Node.jsと比べた場合のベンチマークは取りましたか。
公式のベンチマークは取っていません。個人的に基本的な性能と拡張性の調査を行っていますが、その結果はNode.jsよりも遥かに優れていました。もう少し後になったらベンチマークの結果を公表したいと思います。
InfoQ: vert.xとNettyを比べるとどうですか。
Nettyは素晴らしい低レベルのIOライブラリです。Vert.xもNettyを使っています。しかし、vert.xはアプリケーション向けの完成されたプラットフォームです。Vert.xはコンポーネントモデルやファイルIOなど、Nettyにはない様々な特徴を提供します。JVMの世界では、Vert.xはAkka (akkaもNettyを使っています)のようなフレームワークと競合します。
Vert.xはApacheライセンスバージョン2.0で公開されており、VMwareがスポンサーをしている。コントリビューションはSpringSource Individual Contributor License Agreementに従う。
Dionysios G. Synodinos氏 はウェブエンジニアでありウェブ関連技術を専門にするフリーランスのコンサルタント。