Vert.x.tari.tari

5,833 views

Published on

Published in: Technology
0 Comments
18 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
5,833
On SlideShare
0
From Embeds
0
Number of Embeds
759
Actions
Shares
0
Downloads
18
Comments
0
Likes
18
Embeds 0
No embeds

No notes for slide

Vert.x.tari.tari

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

×