BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース vert.x – Node.jsの代替フレームワーク

vert.x – Node.jsの代替フレームワーク

原文(投稿日:2012/05/04)へのリンク

 

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氏 はウェブエンジニアでありウェブ関連技術を専門にするフリーランスのコンサルタント。

この記事に星をつける

おすすめ度
スタイル

BT