SlideShare una empresa de Scribd logo
1 de 110
Descargar para leer sin conexión
非同期したり
イベント駆動したり
∼Vert.xのちょっとした話∼
   2012/10/26 at G*ワークショップ
改め
非同期したり
 イベント駆動したり
あとは時々スケールしたり
 ∼Vert.xのちょっとした話∼
  2012/10/26 at G*ワークショップ
お前誰よ?
•名前:杉浦孝博

•@touchez_du_bois

•自称 アニメ営業 担当

•時々 他社製品営業 担当
閑話休題
前期(7∼9月)の
おススメアニメ
  と言えば
人類は
衰退しました
TARI TARI
ですが、
今期(10∼11
月)のおススメ
アニメと言えば
ジョジョの
奇妙な冒険
となりの
怪物くん
中二病でも
恋がしたい!
中二病でも
恋がしたい!
   Lite
デス!
です。
さて、
本題(営業活
動)が終わり
ましたので、
ここから40
 分弱、
余談
です。
さて、
時は西暦
2006年
C10K問題
C10K問題
• ハードウェアの性能上は問題がなくても、
 あまりにもクライアントの数が多くなると
 サーバがパンクする問題のこと。

• http://www.hyuki.com/yukiwiki/
 wiki.cgi?TheC10kProblem
C10K問題

• プロセスのfork、マルチスレッド化。
   • 生成にリソースが必要。
   • コンテキストスイッチが発生。
C10K問題

• ブロッキングI/O (同期I/O)。
   • アプリは作りやすい(素直なロジック)。
   • 入出力の完了を待つ必要がある。
C10K問題
• ネットワーク上のリクエストの増加。
   • スマートフォンの普及。
   • WebSocketsなどでクライアント/サー
   バ間を繋ぎっぱなしに。
そこで
C10K問題
• 次の方法で対応。
 • シングルスレッドモデル。
 • ノンブロッキングI/O (非同期I/O)。
 • イベント駆動。
Java界隈では
NIO
  from
J2SE 1.4
NIO.2
 from
Java 7
Netty
from
JBoss
Groovy界隈
   では
Gretty
  from
Alex Tkachman
Gretty
•次のURLを参照。
• http://uehaj.hatenablog.com/entry/
    20100819/1282168541

• http://d.hatena.ne.jp/toby55kij/
    20111223/1324568112

• http://www.ibm.com/developerworks/jp/java/
    library/j-javadev2-20/index.html
そして...
Vert.x
Vert.xとは
•非同期、スケーラブル、並列処
 理アプリケーション開発のため
 のフレームワーク。

•公式ページ:http://vertx.io/

• バージョン:1.3.0 final
Vert.xとは
•開発リーダー:Tim Fox
Vert.xの特徴
Vert.xの特徴 (1)
•JVM上で動作。多言語対応。

 • Java, Groovy, JavaScript,
  CoffeeScript, Ruby, Python
  に対応。

 •   Scala, Clojureに対応予定。
Vert.xの特徴 (2)

•
イベント駆動モデル。

 • イベントに対して、イベントを
 処理するハンドラを記述。

•   ハンドラは非同期に実行。
Vert.xの特徴 (3)
•
シンプルな並列処理モデル。

 • シングルスレッドモデルのよう
 にコードを記述。

•synchronized, volatile, 明示
 的なロックは基本的に不要。
Vert.xの特徴 (4)
•
割と楽にスケーリング。

 • メッセージパッシングや
 immutableな共有データなど
 を使用。

•   自前で頑張らなくてもよい。
Vert.xの
コンセプト
Verticle

•
Vert.xのデプロイの単位。

• メインのスクリプト、及び参照
されるスクリプトやjarやリソー
スを含む。
Verticle

•1つのVerticleのみで単独動作。

• 複数のVerticleがイベントバス
を使用して協調動作。
Verticle
インスタンス




            イベントバス

             JVM
Vert.xインスタンス

•Verticleが実行される環境。

• Vert.xインスタンス自体は、
JVM上で実行される。
Vert.xインスタンス

•
Vert.xインスタンスは、同じホ
スト、同じネットワークの異な
るホスト上に同時に複数存在
可。
Vert.xインスタンス

•
Vert.xインスタンスは、独自の
クラスローダでそれぞれの
Verticleを実行。

•Verticle同士は独立。
Vert.xインスタンス

•
Vert.xインスタンス同士でクラ
スタを構成、分散イベントバス
を形成して、Verticle同士が通
信できる。
Verticle
インスタンス

  Vert.x
インスタンス
            イベントバス


             JVM
多言語対応
•
好きな言語でVerticleを開発で
きる。

•
異なる言語で書かれたVerticle
同士をシームレスに連携でき
る。
イベント駆動
•
Verticle開発のほとんどは、イ
ベントハンドラの設定。

•
ノンブロッキング、マルチスレ
ッドによるコンテキストスイッ
チやスタック領域への対応。
イベントループ
•
イベントを処理し、Verticleに
ディスパッチするスレッド。

•複数イベントループを作成可。

• Verticleインスタンスは常に同
じイベントループに割り当て。
イベントループ

•
1つのイベントループに複数の
Verticleインスタンスを処理。

•マルチ・リアクター・パターン

 • イベントループが複数のため。
イベント
  ループ
 Verticle
インスタンス

  Vert.x
インスタンス
            イベントバス


             JVM
メッセージパッシング

•
同じVert.xインスタンス内、あ
るいは異なるVert.xインスタン
スで、イベンストバスを通じメ
ッセージをやり取りすることで
他のVerticleと通信が可能。
メッセージパッシング

•
あるVerticleから別の複数の
Verticleにメッセージパッシン
グすることで、マルチスレッド
的な使い方ができ。スケールも
可能。
イベント
  ループ
 Verticle
インスタンス

  Vert.x
インスタンス

            イベントバス

             JVM
共有データ

•
メッセージパッシングが常に最
良の解とは限らない。

•
ひとつのVerticleにメッセージ
が集中してしまう場合。
共有データ

•
不変なデータのみ、Verticle間
で共有が可能。

•
共有マップと共有セットが利用
可能。
ワーカーVerticle
•
Verticleインスタンスはイベン
トループに割り当てられ実行(デ
ィスパッチ)。

•
Verticleインスタンスは処理を
ブロックすべきではない。
ワーカーVerticle

•
でも、どうしてもブロックする
ケースが出てくる。

•例えば、JDBC API。
ワーカーVerticle
•
ワーカーVerticleとは、イベン
トループに割り当てられていな
いVerticle。

•
バックグラウンドのスレッドプ
ールで実行。
ワーカーVerticle
•いくつか制限がある。

• 複数のスレッドで同時に実行さ
れることはない。

•
TCP/HTTPのクライント/サー
バでは使用できない。
コアサービス
•
Verticleから直接呼び出し可能
なサービス(API)。

•
サーバやクライアント作成に必
要そうなものはひととおり揃え
てある。
コアサービス
•   TCP/SSLのサーバ/クライアント

•   HTTP/HTTPSのサーバ/クライアント

•   WebSocketsのサーバ/クライアント

•   分散イベントバスへのアクセス

•   定期的かつ単発のタイマー

•   バッファ

•   フロー制御

•   ファイルシステム上のファイルアクセス

•   共有マップ、共有セット

•   ロギング

•   SockJSサーバ構築

•   Verticleのデプロイ/アンデプロイ
モジュール

•
アプリケーションや再利用可能
なリソースをパッケージ化した
もの。

•どの言語でも記述できる。
モジュール

•
イベントバス上でJSONメッセ
ージを送受信することで
Verticleインスタンスや他のモ
ジュールから通信が可能。
モジュール
• https://github.com/vert-x/vertx-mods
 • Webサーバ
 • キュー
 • mongodbアクセス
 • メール送信
 • 認証
 • ファイルアップロード
ライブラリ
•
次のオープンソースライブラリ
を使用。

•   Netty : ネットワークI/O

• Hazelcast : クラスタリング
    各言語の実行エンジン
Demo
Hello,World
 的なもの
HelloWorld.groovy
vertx.createHttpServer().requestHandler
{ request ->
  request.response.end(“””
<html>
  <body>
     <h1>Hello, World!</h1>
  </body>
</html>
“””)
}.listen(8080, 'localhost')
$ vertx run HelloWorld.groovy
課題
課題
•エラーが意味不明。

 • 1.3.0でサンプルが動かなくな
 った...orz

•どこで落ちたかがわからな
 い...orz
auxo:demo02 rhapsody$ vertx run App.groovy
Exception in Groovy verticle
java.lang.NullPointerException
!   at org.vertx.java.deploy.impl.VerticleManager$1.handle(VerticleManager.java:169)
!   at org.vertx.java.deploy.impl.VerticleManager$1.handle(VerticleManager.java:166)
!   at org.vertx.java.core.impl.BlockingAction$1$1.run(BlockingAction.java:60)
!   at org.vertx.java.core.impl.Context$2.run(Context.java:122)
!   at
org.jboss.netty.channel.socket.nio.AbstractNioWorker.processEventQueue(AbstractNioWorker.jav
a:453)
!   at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:330)
!   at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:35)
!   at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:102)
!   at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42)
!   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
!   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
!   at java.lang.Thread.run(Thread.java:722)
Demo 2
ちょっと
凝ったもの
落ち穂拾い
ドキュメント
•
ドキュメントは割と充実。

 • メインマニュアル

 • 言語ごとにコアマニュアルと
 APIドキュメント
 モジュール用マニュアル
チュートリアル
•
Webアプリケーションを作る。

 • Webサーバ用モジュール、
 MongoDBを使った永続化、イ
 ベントバスを使った通信な
 ど。
サンプル
•
コアサービスの使い方がだいた
い分かるサンプル。
• TCP/SSL, HTTP/HTTPS
• イベントバス
• WebSockets, SockJS
• ファイルアップロード、など
Grailsから使う
•GrailsからSockJSを使う例

 • https://gist.github.com/
  2652835

 •BootStrapでSockJSServer
  インスタンスを生成し起動。
import org.vertx.groovy.core.Vertx

class BootStrap {

    def init = { servletContext ->
        def vertx = Vertx.newVertx()
        def httpServer = vertx.createHttpServer()
        def server = vertx.createSockJSServer(httpServer)
        server = installApp(prefix: '/events') { sock ->
            sock.dataHandler { buff ->
                sock << buff
            }
        }

        httpServer.listen(8585)
    }

    def destroy = {
    }
}
   var sock = new SockJS('http://localhost:8585/events');
   sock.onopen = function() {
       console.log('open');
   };
   sock.onmessage = function(e) {
       console.log('message', e.data);
       alert('received message echoed from server: ' + e.data);
   };
   sock.onclose = function() {
       console.log('close');
   };

   function send(message) {

     if (sock.readyState == WebSocket.OPEN) {
        console.log("sending message")
        sock.send(message);
     } else {
        console.log("The socket is not open.");
     }
   }
まとめ
まとめ (副業)
•
Vert.xは非同期でスケーラブル
な並列処理アプリケーションを
開発するためのフレームワーク
•
リクエストをせっせと捌くよう
な用途に使用することを検討し
てみてはいかがでしょうか。
まとめ (本業)

•
円盤(Blu-ray/DVD)買ってね♡
 • ジョジョの奇妙な冒険
 • となりの怪物くん
 • 中二病でも恋がしたい!
おまけ
先程の
ドキュメント
•
ドキュメントは割と充実。

 • メインマニュアル

 • 言語ごとにコアマニュアルと
 APIドキュメント
 モジュール用マニュアル
ですが、
株式会社
ニューキャスト
  さんの
Mybetabook
http://mybetabook.com/
で
絶賛翻訳中
 です。
ということで、
ご清聴ありがとう
ございました。

Más contenido relacionado

La actualidad más candente

Webブラウザで使える文献Web API取得結果のスプレッドシート化 ~ Google Colab始めました ~
Webブラウザで使える文献Web API取得結果のスプレッドシート化 ~ Google Colab始めました ~Webブラウザで使える文献Web API取得結果のスプレッドシート化 ~ Google Colab始めました ~
Webブラウザで使える文献Web API取得結果のスプレッドシート化 ~ Google Colab始めました ~
genroku
 
ドキュメンテーションを加速するストレスフリーの作図ツール『blockdiag』 jus2011年6月勉強会
ドキュメンテーションを加速するストレスフリーの作図ツール『blockdiag』 jus2011年6月勉強会ドキュメンテーションを加速するストレスフリーの作図ツール『blockdiag』 jus2011年6月勉強会
ドキュメンテーションを加速するストレスフリーの作図ツール『blockdiag』 jus2011年6月勉強会
Takayuki Shimizukawa
 
Sphinxで作る貢献しやすい ドキュメント翻訳の仕組み
Sphinxで作る貢献しやすいドキュメント翻訳の仕組みSphinxで作る貢献しやすいドキュメント翻訳の仕組み
Sphinxで作る貢献しやすい ドキュメント翻訳の仕組み
Takayuki Shimizukawa
 

La actualidad más candente (20)

Heuristic ux-evaluation
Heuristic ux-evaluationHeuristic ux-evaluation
Heuristic ux-evaluation
 
Kotlin and Domain-Driven Design: A perfect match - Kotlin Meetup Munich
Kotlin and Domain-Driven Design: A perfect match - Kotlin Meetup MunichKotlin and Domain-Driven Design: A perfect match - Kotlin Meetup Munich
Kotlin and Domain-Driven Design: A perfect match - Kotlin Meetup Munich
 
やりなおせる Git 入門
やりなおせる Git 入門やりなおせる Git 入門
やりなおせる Git 入門
 
Webブラウザで使える文献Web API取得結果のスプレッドシート化 ~ Google Colab始めました ~
Webブラウザで使える文献Web API取得結果のスプレッドシート化 ~ Google Colab始めました ~Webブラウザで使える文献Web API取得結果のスプレッドシート化 ~ Google Colab始めました ~
Webブラウザで使える文献Web API取得結果のスプレッドシート化 ~ Google Colab始めました ~
 
そんなリザルトキャッシュで大丈夫か? #jjug
そんなリザルトキャッシュで大丈夫か? #jjugそんなリザルトキャッシュで大丈夫か? #jjug
そんなリザルトキャッシュで大丈夫か? #jjug
 
Camel crushermanual
Camel crushermanualCamel crushermanual
Camel crushermanual
 
GoでシュッとWebスクレイピングする
GoでシュッとWebスクレイピングするGoでシュッとWebスクレイピングする
GoでシュッとWebスクレイピングする
 
アンチフラジャイルの世界
アンチフラジャイルの世界アンチフラジャイルの世界
アンチフラジャイルの世界
 
認試軟體測試的世界 & TDD/BDD 入門
認試軟體測試的世界 & TDD/BDD 入門認試軟體測試的世界 & TDD/BDD 入門
認試軟體測試的世界 & TDD/BDD 入門
 
ドキュメンテーションを加速するストレスフリーの作図ツール『blockdiag』 jus2011年6月勉強会
ドキュメンテーションを加速するストレスフリーの作図ツール『blockdiag』 jus2011年6月勉強会ドキュメンテーションを加速するストレスフリーの作図ツール『blockdiag』 jus2011年6月勉強会
ドキュメンテーションを加速するストレスフリーの作図ツール『blockdiag』 jus2011年6月勉強会
 
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22
 
Common Lisp製のテキストエディタLemにフレーム多重化機能をつくった
Common Lisp製のテキストエディタLemにフレーム多重化機能をつくったCommon Lisp製のテキストエディタLemにフレーム多重化機能をつくった
Common Lisp製のテキストエディタLemにフレーム多重化機能をつくった
 
Simple Business Design Method (TakumiMethod)
Simple Business Design Method (TakumiMethod) Simple Business Design Method (TakumiMethod)
Simple Business Design Method (TakumiMethod)
 
図解で学ぶ「Lean UX」
図解で学ぶ「Lean UX」図解で学ぶ「Lean UX」
図解で学ぶ「Lean UX」
 
Startup science 2018 5 Customer Problem Fit
Startup science 2018 5 Customer Problem FitStartup science 2018 5 Customer Problem Fit
Startup science 2018 5 Customer Problem Fit
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
 
F2E&RGBA Talk - 設計師的自我修煉之路 170622
F2E&RGBA Talk - 設計師的自我修煉之路 170622F2E&RGBA Talk - 設計師的自我修煉之路 170622
F2E&RGBA Talk - 設計師的自我修煉之路 170622
 
インセプションデッキのひな形(PPT形式:ダウンロード用)
インセプションデッキのひな形(PPT形式:ダウンロード用)インセプションデッキのひな形(PPT形式:ダウンロード用)
インセプションデッキのひな形(PPT形式:ダウンロード用)
 
Sphinxで作る貢献しやすい ドキュメント翻訳の仕組み
Sphinxで作る貢献しやすいドキュメント翻訳の仕組みSphinxで作る貢献しやすいドキュメント翻訳の仕組み
Sphinxで作る貢献しやすい ドキュメント翻訳の仕組み
 
Conceptualizing Rurality with Michel de Certeau
Conceptualizing Rurality with Michel de CerteauConceptualizing Rurality with Michel de Certeau
Conceptualizing Rurality with Michel de Certeau
 

Destacado (7)

Closures and methodMissing are real
Closures and methodMissing are realClosures and methodMissing are real
Closures and methodMissing are real
 
ジャパネットQB GPars
ジャパネットQB GParsジャパネットQB GPars
ジャパネットQB GPars
 
GContractsの基礎
GContractsの基礎GContractsの基礎
GContractsの基礎
 
Introduction to Spock
Introduction to SpockIntroduction to Spock
Introduction to Spock
 
Goos 001
Goos 001Goos 001
Goos 001
 
Groovyしたり RPしなかったり あとは時々布教活動したり
Groovyしたり RPしなかったり あとは時々布教活動したりGroovyしたり RPしなかったり あとは時々布教活動したり
Groovyしたり RPしなかったり あとは時々布教活動したり
 
GroovyからAnime
GroovyからAnimeGroovyからAnime
GroovyからAnime
 

Similar a Vert.x.tari.tari

Java scriptでslideを作ってみた
Java scriptでslideを作ってみたJava scriptでslideを作ってみた
Java scriptでslideを作ってみた
Katsuhito Yonao
 
GraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼう
GraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼうGraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼう
GraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼう
Koichi Sakata
 
Tizen web app について調べたよ
Tizen web app について調べたよTizen web app について調べたよ
Tizen web app について調べたよ
Naruto TAKAHASHI
 
WordBench Kobe jQueryどうでしょう
WordBench Kobe jQueryどうでしょうWordBench Kobe jQueryどうでしょう
WordBench Kobe jQueryどうでしょう
Hishikawa Takuro
 
ななめ45°から見たJavaOne
ななめ45°から見たJavaOneななめ45°から見たJavaOne
ななめ45°から見たJavaOne
AdvancedTechNight
 

Similar a Vert.x.tari.tari (20)

Pronama 0707 wf4
Pronama 0707 wf4Pronama 0707 wf4
Pronama 0707 wf4
 
20140803 docker
20140803 docker20140803 docker
20140803 docker
 
PHP7をDockerで動かしたという話
PHP7をDockerで動かしたという話PHP7をDockerで動かしたという話
PHP7をDockerで動かしたという話
 
Node.js で Web アプリ開発
Node.js で Web アプリ開発Node.js で Web アプリ開発
Node.js で Web アプリ開発
 
Java scriptでslideを作ってみた
Java scriptでslideを作ってみたJava scriptでslideを作ってみた
Java scriptでslideを作ってみた
 
スマートフォン対応、気をつけたいトラブル
スマートフォン対応、気をつけたいトラブルスマートフォン対応、気をつけたいトラブル
スマートフォン対応、気をつけたいトラブル
 
TypeScriptをオススメする理由
TypeScriptをオススメする理由TypeScriptをオススメする理由
TypeScriptをオススメする理由
 
Groovy Bootcamp 2015 by JGGUG
Groovy Bootcamp 2015 by JGGUGGroovy Bootcamp 2015 by JGGUG
Groovy Bootcamp 2015 by JGGUG
 
GraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼう
GraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼうGraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼう
GraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼう
 
Tizen web app について調べたよ
Tizen web app について調べたよTizen web app について調べたよ
Tizen web app について調べたよ
 
SocketStream入門
SocketStream入門SocketStream入門
SocketStream入門
 
作られては消えていく泡のように儚いクラスタの運用話
作られては消えていく泡のように儚いクラスタの運用話作られては消えていく泡のように儚いクラスタの運用話
作られては消えていく泡のように儚いクラスタの運用話
 
レスポンシブWebデザイン【発展編】
レスポンシブWebデザイン【発展編】レスポンシブWebデザイン【発展編】
レスポンシブWebデザイン【発展編】
 
WordBench Kobe jQueryどうでしょう
WordBench Kobe jQueryどうでしょうWordBench Kobe jQueryどうでしょう
WordBench Kobe jQueryどうでしょう
 
Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)
 
ななめ45°から見たJavaOne
ななめ45°から見たJavaOneななめ45°から見たJavaOne
ななめ45°から見たJavaOne
 
Dockerでらくらく開発・運用を体感しよう
Dockerでらくらく開発・運用を体感しようDockerでらくらく開発・運用を体感しよう
Dockerでらくらく開発・運用を体感しよう
 
初心者が伝えるDocker超入門
初心者が伝えるDocker超入門初心者が伝えるDocker超入門
初心者が伝えるDocker超入門
 
PlayFramework1.x基礎編
PlayFramework1.x基礎編PlayFramework1.x基礎編
PlayFramework1.x基礎編
 
今時のDev opsの取り組み事例集
今時のDev opsの取り組み事例集今時のDev opsの取り組み事例集
今時のDev opsの取り組み事例集
 

Vert.x.tari.tari