110
非同期したり イベント駆動したり ~Vert.xのちょっとした話~ 2012/10/26 at G*ワークショップ

Vert.x.tari.tari

Embed Size (px)

Citation preview

Page 1: Vert.x.tari.tari

非同期したりイベント駆動したり~Vert.xのちょっとした話~

2012/10/26 at G*ワークショップ

Page 2: Vert.x.tari.tari

改め

Page 3: Vert.x.tari.tari

非同期したりイベント駆動したり

あとは時々スケールしたり~Vert.xのちょっとした話~

2012/10/26 at G*ワークショップ

Page 4: Vert.x.tari.tari

お前誰よ?•名前:杉浦孝博•@touchez_du_bois•自称”アニメ営業”担当•時々”他社製品営業”担当

Page 5: Vert.x.tari.tari

閑話休題

Page 6: Vert.x.tari.tari

前期(7~9月)のおススメアニメと言えば

Page 7: Vert.x.tari.tari
Page 8: Vert.x.tari.tari

人類は衰退しました

Page 9: Vert.x.tari.tari
Page 10: Vert.x.tari.tari

TARI TARI

Page 11: Vert.x.tari.tari

ですが、

Page 12: Vert.x.tari.tari

今期(10~11月)のおススメアニメと言えば

Page 13: Vert.x.tari.tari
Page 14: Vert.x.tari.tari

ジョジョの奇妙な冒険

Page 15: Vert.x.tari.tari
Page 16: Vert.x.tari.tari

となりの怪物くん

Page 17: Vert.x.tari.tari
Page 18: Vert.x.tari.tari

中二病でも恋がしたい!

Page 19: Vert.x.tari.tari
Page 20: Vert.x.tari.tari

中二病でも恋がしたい!

Lite

Page 21: Vert.x.tari.tari

デス!です。

Page 22: Vert.x.tari.tari

さて、

Page 23: Vert.x.tari.tari

本題(営業活動)が終わりましたので、

Page 24: Vert.x.tari.tari

ここから40分弱、

Page 25: Vert.x.tari.tari

余談

Page 26: Vert.x.tari.tari

です。

Page 27: Vert.x.tari.tari

さて、

Page 28: Vert.x.tari.tari

時は西暦2006年

Page 29: Vert.x.tari.tari

C10K問題

Page 30: Vert.x.tari.tari

C10K問題•ハードウェアの性能上は問題がなくても、あまりにもクライアントの数が多くなるとサーバがパンクする問題のこと。

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

Page 31: Vert.x.tari.tari

C10K問題

•プロセスのfork、マルチスレッド化。

•生成にリソースが必要。

•コンテキストスイッチが発生。

Page 32: Vert.x.tari.tari

C10K問題

•ブロッキングI/O (同期I/O)。

•アプリは作りやすい(素直なロジック)。

•入出力の完了を待つ必要がある。

Page 33: Vert.x.tari.tari

C10K問題

•ネットワーク上のリクエストの増加。

•スマートフォンの普及。

•WebSocketsなどでクライアント/サーバ間を繋ぎっぱなしに。

Page 34: Vert.x.tari.tari

そこで

Page 35: Vert.x.tari.tari

C10K問題•次の方法で対応。

•シングルスレッドモデル。

•ノンブロッキングI/O (非同期I/O)。

•イベント駆動。

Page 36: Vert.x.tari.tari

Java界隈では

Page 37: Vert.x.tari.tari

NIOfrom

J2SE 1.4

Page 38: Vert.x.tari.tari

NIO.2fromJava 7

Page 39: Vert.x.tari.tari

NettyfromJBoss

Page 40: Vert.x.tari.tari

Groovy界隈では

Page 41: Vert.x.tari.tari

Grettyfrom

Alex Tkachman

Page 43: Vert.x.tari.tari

そして...

Page 44: Vert.x.tari.tari

Vert.x

Page 45: Vert.x.tari.tari

Vert.xとは•非同期、スケーラブル、並列処理アプリケーション開発のためのフレームワーク。

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

•バージョン:1.3.0 final

Page 46: Vert.x.tari.tari

Vert.xとは•開発リーダー:Tim Fox

Page 47: Vert.x.tari.tari

Vert.xの特徴

Page 48: Vert.x.tari.tari

Vert.xの特徴 (1)•JVM上で動作。多言語対応。

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

•Scala, Clojureに対応予定。

Page 49: Vert.x.tari.tari

Vert.xの特徴 (2)

•イベント駆動モデル。

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

•ハンドラは非同期に実行。

Page 50: Vert.x.tari.tari

Vert.xの特徴 (3)•シンプルな並列処理モデル。

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

•synchronized, volatile, 明示的なロックは基本的に不要。

Page 51: Vert.x.tari.tari

Vert.xの特徴 (4)•割と楽にスケーリング。

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

•自前で頑張らなくてもよい。

Page 52: Vert.x.tari.tari

Vert.xのコンセプト

Page 53: Vert.x.tari.tari

Verticle

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

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

Page 54: Vert.x.tari.tari

Verticle

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

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

Page 55: Vert.x.tari.tari

JVM

イベントバス

Verticleインスタンス

Page 56: Vert.x.tari.tari

Vert.xインスタンス

•Verticleが実行される環境。

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

Page 57: Vert.x.tari.tari

Vert.xインスタンス

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

Page 58: Vert.x.tari.tari

Vert.xインスタンス

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

•Verticle同士は独立。

Page 59: Vert.x.tari.tari

Vert.xインスタンス

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

Page 60: Vert.x.tari.tari

JVM

Verticleインスタンス

イベントバス

Vert.xインスタンス

Page 61: Vert.x.tari.tari

多言語対応

•好きな言語でVerticleを開発できる。

•異なる言語で書かれたVerticle同士をシームレスに連携できる。

Page 62: Vert.x.tari.tari

イベント駆動

•Verticle開発のほとんどは、イベントハンドラの設定。

•ノンブロッキング、マルチスレッドによるコンテキストスイッチやスタック領域への対応。

Page 63: Vert.x.tari.tari

イベントループ•イベントを処理し、Verticleにディスパッチするスレッド。

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

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

Page 64: Vert.x.tari.tari

イベントループ

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

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

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

Page 65: Vert.x.tari.tari

JVM

Verticleインスタンス

イベントバス

Vert.xインスタンス

イベントループ

Page 66: Vert.x.tari.tari

メッセージパッシング

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

Page 67: Vert.x.tari.tari

メッセージパッシング

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

Page 68: Vert.x.tari.tari

JVM

Verticleインスタンス

イベントバス

Vert.xインスタンス

イベントループ

Page 69: Vert.x.tari.tari

共有データ

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

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

Page 70: Vert.x.tari.tari

共有データ

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

•共有マップと共有セットが利用可能。

Page 71: Vert.x.tari.tari

ワーカーVerticle

•Verticleインスタンスはイベントループに割り当てられ実行(ディスパッチ)。

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

Page 72: Vert.x.tari.tari

ワーカーVerticle

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

•例えば、JDBC API。

Page 73: Vert.x.tari.tari

ワーカーVerticle

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

•バックグラウンドのスレッドプールで実行。

Page 74: Vert.x.tari.tari

ワーカーVerticle•いくつか制限がある。

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

•TCP/HTTPのクライント/サーバでは使用できない。

Page 75: Vert.x.tari.tari

コアサービス

•Verticleから直接呼び出し可能なサービス(API)。

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

Page 76: Vert.x.tari.tari

コアサービス• TCP/SSLのサーバ/クライアント

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

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

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

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

• バッファ

• フロー制御

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

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

• ロギング

• SockJSサーバ構築

• Verticleのデプロイ/アンデプロイ

Page 77: Vert.x.tari.tari

モジュール

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

•どの言語でも記述できる。

Page 78: Vert.x.tari.tari

モジュール

•イベントバス上でJSONメッセージを送受信することでVerticleインスタンスや他のモジュールから通信が可能。

Page 79: Vert.x.tari.tari

モジュール• https://github.com/vert-x/vertx-mods

• Webサーバ

• キュー

• mongodbアクセス

• メール送信

• 認証

• ファイルアップロード

Page 80: Vert.x.tari.tari

ライブラリ•次のオープンソースライブラリを使用。

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

•Hazelcast : クラスタリング

•各言語の実行エンジン

Page 81: Vert.x.tari.tari

Demo

Page 82: Vert.x.tari.tari

Hello,World的なもの

Page 83: Vert.x.tari.tari

vertx.createHttpServer().requestHandler { request -> request.response.end(“””<html> <body> <h1>Hello, World!</h1> </body></html>“””)}.listen(8080, 'localhost')

HelloWorld.groovy

Page 84: Vert.x.tari.tari

$ vertx run HelloWorld.groovy

Page 85: Vert.x.tari.tari

課題

Page 86: Vert.x.tari.tari

課題•エラーが意味不明。

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

•どこで落ちたかがわからない...orz

Page 87: Vert.x.tari.tari

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.java: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)

Page 88: Vert.x.tari.tari

Demo 2

Page 89: Vert.x.tari.tari

ちょっと凝ったもの

Page 90: Vert.x.tari.tari

落ち穂拾い

Page 91: Vert.x.tari.tari

ドキュメント•ドキュメントは割と充実。

•メインマニュアル

•言語ごとにコアマニュアルとAPIドキュメント

•モジュール用マニュアル

Page 92: Vert.x.tari.tari

チュートリアル

•Webアプリケーションを作る。

•Webサーバ用モジュール、MongoDBを使った永続化、イベントバスを使った通信など。

Page 93: Vert.x.tari.tari

サンプル•コアサービスの使い方がだいたい分かるサンプル。•TCP/SSL, HTTP/HTTPS•イベントバス•WebSockets, SockJS•ファイルアップロード、など

Page 94: Vert.x.tari.tari

Grailsから使う•GrailsからSockJSを使う例

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

•BootStrapでSockJSServerインスタンスを生成し起動。

Page 95: Vert.x.tari.tari

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 = {    }}

Page 96: Vert.x.tari.tari

   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.");     }   }

Page 97: Vert.x.tari.tari

まとめ

Page 98: Vert.x.tari.tari

まとめ (副業)•Vert.xは非同期でスケーラブルな並列処理アプリケーションを開発するためのフレームワーク

•リクエストをせっせと捌くような用途に使用することを検討してみてはいかがでしょうか。

Page 99: Vert.x.tari.tari

まとめ (本業)

•円盤(Blu-ray/DVD)買ってね♡

•ジョジョの奇妙な冒険

•となりの怪物くん

•中二病でも恋がしたい!

Page 100: Vert.x.tari.tari

おまけ

Page 101: Vert.x.tari.tari

先程の

Page 102: Vert.x.tari.tari

ドキュメント•ドキュメントは割と充実。

•メインマニュアル

•言語ごとにコアマニュアルとAPIドキュメント

•モジュール用マニュアル

Page 103: Vert.x.tari.tari

ですが、

Page 104: Vert.x.tari.tari

株式会社ニューキャストさんの

Page 105: Vert.x.tari.tari

Mybetabookhttp://mybetabook.com/

Page 106: Vert.x.tari.tari
Page 107: Vert.x.tari.tari

で絶賛翻訳中です。

Page 108: Vert.x.tari.tari
Page 109: Vert.x.tari.tari

ということで、

Page 110: Vert.x.tari.tari

ご清聴ありがとうございました。