Uploaded on

 

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
4,398
On Slideshare
0
From Embeds
0
Number of Embeds
6

Actions

Shares
Downloads
14
Comments
0
Likes
18

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. 非同期したりイベント駆動したり∼Vert.xのちょっとした話∼ 2012/10/26 at G*ワークショップ
  • 2. 改め
  • 3. 非同期したり イベント駆動したりあとは時々スケールしたり ∼Vert.xのちょっとした話∼ 2012/10/26 at G*ワークショップ
  • 4. お前誰よ?•名前:杉浦孝博•@touchez_du_bois•自称 アニメ営業 担当•時々 他社製品営業 担当
  • 5. 閑話休題
  • 6. 前期(7∼9月)のおススメアニメ と言えば
  • 7. 人類は衰退しました
  • 8. TARI TARI
  • 9. ですが、
  • 10. 今期(10∼11月)のおススメアニメと言えば
  • 11. ジョジョの奇妙な冒険
  • 12. となりの怪物くん
  • 13. 中二病でも恋がしたい!
  • 14. 中二病でも恋がしたい! Lite
  • 15. デス!です。
  • 16. さて、
  • 17. 本題(営業活動)が終わりましたので、
  • 18. ここから40 分弱、
  • 19. 余談
  • 20. です。
  • 21. さて、
  • 22. 時は西暦2006年
  • 23. C10K問題
  • 24. C10K問題• ハードウェアの性能上は問題がなくても、 あまりにもクライアントの数が多くなると サーバがパンクする問題のこと。• http://www.hyuki.com/yukiwiki/ wiki.cgi?TheC10kProblem
  • 25. C10K問題• プロセスのfork、マルチスレッド化。 • 生成にリソースが必要。 • コンテキストスイッチが発生。
  • 26. C10K問題• ブロッキングI/O (同期I/O)。 • アプリは作りやすい(素直なロジック)。 • 入出力の完了を待つ必要がある。
  • 27. C10K問題• ネットワーク上のリクエストの増加。 • スマートフォンの普及。 • WebSocketsなどでクライアント/サー バ間を繋ぎっぱなしに。
  • 28. そこで
  • 29. C10K問題• 次の方法で対応。 • シングルスレッドモデル。 • ノンブロッキングI/O (非同期I/O)。 • イベント駆動。
  • 30. Java界隈では
  • 31. NIO fromJ2SE 1.4
  • 32. NIO.2 fromJava 7
  • 33. NettyfromJBoss
  • 34. Groovy界隈 では
  • 35. Gretty fromAlex Tkachman
  • 36. 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
  • 37. そして...
  • 38. Vert.x
  • 39. Vert.xとは•非同期、スケーラブル、並列処 理アプリケーション開発のため のフレームワーク。•公式ページ:http://vertx.io/• バージョン:1.3.0 final
  • 40. Vert.xとは•開発リーダー:Tim Fox
  • 41. Vert.xの特徴
  • 42. Vert.xの特徴 (1)•JVM上で動作。多言語対応。 • Java, Groovy, JavaScript, CoffeeScript, Ruby, Python に対応。 • Scala, Clojureに対応予定。
  • 43. Vert.xの特徴 (2)•イベント駆動モデル。 • イベントに対して、イベントを 処理するハンドラを記述。• ハンドラは非同期に実行。
  • 44. Vert.xの特徴 (3)•シンプルな並列処理モデル。 • シングルスレッドモデルのよう にコードを記述。•synchronized, volatile, 明示 的なロックは基本的に不要。
  • 45. Vert.xの特徴 (4)•割と楽にスケーリング。 • メッセージパッシングや immutableな共有データなど を使用。• 自前で頑張らなくてもよい。
  • 46. Vert.xのコンセプト
  • 47. Verticle•Vert.xのデプロイの単位。• メインのスクリプト、及び参照されるスクリプトやjarやリソースを含む。
  • 48. Verticle•1つのVerticleのみで単独動作。• 複数のVerticleがイベントバスを使用して協調動作。
  • 49. Verticleインスタンス イベントバス JVM
  • 50. Vert.xインスタンス•Verticleが実行される環境。• Vert.xインスタンス自体は、JVM上で実行される。
  • 51. Vert.xインスタンス•Vert.xインスタンスは、同じホスト、同じネットワークの異なるホスト上に同時に複数存在可。
  • 52. Vert.xインスタンス•Vert.xインスタンスは、独自のクラスローダでそれぞれのVerticleを実行。•Verticle同士は独立。
  • 53. Vert.xインスタンス•Vert.xインスタンス同士でクラスタを構成、分散イベントバスを形成して、Verticle同士が通信できる。
  • 54. Verticleインスタンス Vert.xインスタンス イベントバス JVM
  • 55. 多言語対応•好きな言語でVerticleを開発できる。•異なる言語で書かれたVerticle同士をシームレスに連携できる。
  • 56. イベント駆動•Verticle開発のほとんどは、イベントハンドラの設定。•ノンブロッキング、マルチスレッドによるコンテキストスイッチやスタック領域への対応。
  • 57. イベントループ•イベントを処理し、Verticleにディスパッチするスレッド。•複数イベントループを作成可。• Verticleインスタンスは常に同じイベントループに割り当て。
  • 58. イベントループ•1つのイベントループに複数のVerticleインスタンスを処理。•マルチ・リアクター・パターン • イベントループが複数のため。
  • 59. イベント ループ Verticleインスタンス Vert.xインスタンス イベントバス JVM
  • 60. メッセージパッシング•同じVert.xインスタンス内、あるいは異なるVert.xインスタンスで、イベンストバスを通じメッセージをやり取りすることで他のVerticleと通信が可能。
  • 61. メッセージパッシング•あるVerticleから別の複数のVerticleにメッセージパッシングすることで、マルチスレッド的な使い方ができ。スケールも可能。
  • 62. イベント ループ Verticleインスタンス Vert.xインスタンス イベントバス JVM
  • 63. 共有データ•メッセージパッシングが常に最良の解とは限らない。•ひとつのVerticleにメッセージが集中してしまう場合。
  • 64. 共有データ•不変なデータのみ、Verticle間で共有が可能。•共有マップと共有セットが利用可能。
  • 65. ワーカーVerticle•Verticleインスタンスはイベントループに割り当てられ実行(ディスパッチ)。•Verticleインスタンスは処理をブロックすべきではない。
  • 66. ワーカーVerticle•でも、どうしてもブロックするケースが出てくる。•例えば、JDBC API。
  • 67. ワーカーVerticle•ワーカーVerticleとは、イベントループに割り当てられていないVerticle。•バックグラウンドのスレッドプールで実行。
  • 68. ワーカーVerticle•いくつか制限がある。• 複数のスレッドで同時に実行されることはない。•TCP/HTTPのクライント/サーバでは使用できない。
  • 69. コアサービス•Verticleから直接呼び出し可能なサービス(API)。•サーバやクライアント作成に必要そうなものはひととおり揃えてある。
  • 70. コアサービス• TCP/SSLのサーバ/クライアント• HTTP/HTTPSのサーバ/クライアント• WebSocketsのサーバ/クライアント• 分散イベントバスへのアクセス• 定期的かつ単発のタイマー• バッファ• フロー制御• ファイルシステム上のファイルアクセス• 共有マップ、共有セット• ロギング• SockJSサーバ構築• Verticleのデプロイ/アンデプロイ
  • 71. モジュール•アプリケーションや再利用可能なリソースをパッケージ化したもの。•どの言語でも記述できる。
  • 72. モジュール•イベントバス上でJSONメッセージを送受信することでVerticleインスタンスや他のモジュールから通信が可能。
  • 73. モジュール• https://github.com/vert-x/vertx-mods • Webサーバ • キュー • mongodbアクセス • メール送信 • 認証 • ファイルアップロード
  • 74. ライブラリ•次のオープンソースライブラリを使用。• Netty : ネットワークI/O• Hazelcast : クラスタリング 各言語の実行エンジン
  • 75. Demo
  • 76. Hello,World 的なもの
  • 77. HelloWorld.groovyvertx.createHttpServer().requestHandler{ request -> request.response.end(“””<html> <body> <h1>Hello, World!</h1> </body></html>“””)}.listen(8080, localhost)
  • 78. $ vertx run HelloWorld.groovy
  • 79. 課題
  • 80. 課題•エラーが意味不明。 • 1.3.0でサンプルが動かなくな った...orz•どこで落ちたかがわからな い...orz
  • 81. auxo:demo02 rhapsody$ vertx run App.groovyException in Groovy verticlejava.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)! atorg.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)
  • 82. Demo 2
  • 83. ちょっと凝ったもの
  • 84. 落ち穂拾い
  • 85. ドキュメント•ドキュメントは割と充実。 • メインマニュアル • 言語ごとにコアマニュアルと APIドキュメント モジュール用マニュアル
  • 86. チュートリアル•Webアプリケーションを作る。 • Webサーバ用モジュール、 MongoDBを使った永続化、イ ベントバスを使った通信な ど。
  • 87. サンプル•コアサービスの使い方がだいたい分かるサンプル。• TCP/SSL, HTTP/HTTPS• イベントバス• WebSockets, SockJS• ファイルアップロード、など
  • 88. Grailsから使う•GrailsからSockJSを使う例 • https://gist.github.com/ 2652835 •BootStrapでSockJSServer インスタンスを生成し起動。
  • 89. import org.vertx.groovy.core.Vertxclass 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 = {    }}
  • 90.    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.");     }   }
  • 91. まとめ
  • 92. まとめ (副業)•Vert.xは非同期でスケーラブルな並列処理アプリケーションを開発するためのフレームワーク•リクエストをせっせと捌くような用途に使用することを検討してみてはいかがでしょうか。
  • 93. まとめ (本業)•円盤(Blu-ray/DVD)買ってね♡ • ジョジョの奇妙な冒険 • となりの怪物くん • 中二病でも恋がしたい!
  • 94. おまけ
  • 95. 先程の
  • 96. ドキュメント•ドキュメントは割と充実。 • メインマニュアル • 言語ごとにコアマニュアルと APIドキュメント モジュール用マニュアル
  • 97. ですが、
  • 98. 株式会社ニューキャスト さんの
  • 99. Mybetabookhttp://mybetabook.com/
  • 100. で絶賛翻訳中 です。
  • 101. ということで、
  • 102. ご清聴ありがとうございました。