Upload
takahiro-sugiura
View
4.747
Download
3
Embed Size (px)
Citation preview
非同期したりイベント駆動したり~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界隈では
NIOfrom
J2SE 1.4
NIO.2fromJava 7
NettyfromJBoss
Groovy界隈では
Grettyfrom
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がイベントバスを使用して協調動作。
JVM
イベントバス
Verticleインスタンス
Vert.xインスタンス
•Verticleが実行される環境。
•Vert.xインスタンス自体は、JVM上で実行される。
Vert.xインスタンス
•Vert.xインスタンスは、同じホスト、同じネットワークの異なるホスト上に同時に複数存在可。
Vert.xインスタンス
•Vert.xインスタンスは、独自のクラスローダでそれぞれのVerticleを実行。
•Verticle同士は独立。
Vert.xインスタンス
•Vert.xインスタンス同士でクラスタを構成、分散イベントバスを形成して、Verticle同士が通信できる。
JVM
Verticleインスタンス
イベントバス
Vert.xインスタンス
多言語対応
•好きな言語でVerticleを開発できる。
•異なる言語で書かれたVerticle同士をシームレスに連携できる。
イベント駆動
•Verticle開発のほとんどは、イベントハンドラの設定。
•ノンブロッキング、マルチスレッドによるコンテキストスイッチやスタック領域への対応。
イベントループ•イベントを処理し、Verticleにディスパッチするスレッド。
•複数イベントループを作成可。
•Verticleインスタンスは常に同じイベントループに割り当て。
イベントループ
•1つのイベントループに複数のVerticleインスタンスを処理。
•マルチ・リアクター・パターン
•イベントループが複数のため。
JVM
Verticleインスタンス
イベントバス
Vert.xインスタンス
イベントループ
メッセージパッシング
•同じVert.xインスタンス内、あるいは異なるVert.xインスタンスで、イベンストバスを通じメッセージをやり取りすることで他のVerticleと通信が可能。
メッセージパッシング
•あるVerticleから別の複数のVerticleにメッセージパッシングすることで、マルチスレッド的な使い方ができ。スケールも可能。
JVM
Verticleインスタンス
イベントバス
Vert.xインスタンス
イベントループ
共有データ
•メッセージパッシングが常に最良の解とは限らない。
•ひとつの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的なもの
vertx.createHttpServer().requestHandler { request -> request.response.end(“””<html> <body> <h1>Hello, World!</h1> </body></html>“””)}.listen(8080, 'localhost')
HelloWorld.groovy
$ 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.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)
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ドキュメント
•モジュール用マニュアル
ですが、
株式会社ニューキャストさんの
で絶賛翻訳中です。
ということで、
ご清聴ありがとうございました。