Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
SPDY+WS勉強会(仮)             WebSocket      + Akka (Remote) +Play framework 2.1 Java      原 一浩       @kara_d
自己紹介       ハラ カズヒロ       原 一浩      ( @kara_d )       グレーティブ合同会社代表       http://greative.jp/       Playはじめて&もくもく会主宰       S...
アジェンダ➡   Play 2.1 JavaとWebSocket➡   Akkaについて➡   WebSocketとAkkaとJava➡   Akka Remoteによる並列、分散処理    ※今回は、文字数節約のためにPlay 2.1 Jav...
Play 2.1 JavaとWebSocket
Play frameworkとは?➡   Zenexity(フランスの会社)➡   Typesafe(Scala総本山、Martin Odersky氏など)特徴とされているもの➡   ノンブロッキングIO採用➡   パワフルなコンソールとシンプ...
Play バージョン 2.xについて➡   ∼2012/2    Play 1.x:Javaベース、Groovyテンプレート、 Hibernate独自拡張、    Pythonによるビルドシステム、WebSocketは1.2から➡   2012...
PlayでWebSocketコンテンツの魅力➡   MVCFWを使ったのWebアプリケーションに    ちょこっと導入とかもできちゃう    普通のコントローラーと同じ感覚でWebSocketの処理を書ける    ルーティングも同じ感じ➡   ...
シンプルなWebSocketサンプル➡   ハンズオンでやったもの                     8
SPDYサポート周り➡   Using SPDY and HTTP transparently using    Netty ¦ Smartjava.org    http://www.smartjava.org/content/using-s...
Akkaについて
Akkaってなに?➡   Typesafe社の開発➡   アクターモデルをベースにした非同期処理、並行処理➡   リモーティングによる分散処理➡   アクターの管理と耐障害性(let-it-crash)➡   設定との分離によって位置透過性を担...
ActorRef … アクターのキモ➡   Akkaのアクターへの参照➡   アクターモデル    並行計算の数学的モデルの一種    アクターモデルの基本は「全てのものはアクターである」という哲学    アクターは並行的に受信するメッセージに...
アクターへのメッセージパッシング➡   tellとaskがある    tell      なげっぱ。fire-and-forget。           void tell(Object msg, ActorRef sender)    ask ...
PlayとWebSocketとAkka➡   Playでは、WebSocketを使う場合、    ハンドシェイク時、通信が発生した時の    イベント送出に利用    あと、裏でいろいろ動く非同期系                       ...
WebSocketとAkkaとJava
Play 2.1 Java + WebSocketの全体像        Model             JsonNode        ActorRef      onReceive(o)                      Out...
Play WebSocket with Akkaまとめ➡   通信は双方向かつリアルタイムに行われる(普通)➡   WebSocketにはInとOutがある    WebSocket.In<JsonNode> in    WebSocket.O...
Akkaのイベントシステムについて(1)➡   Akka Javaは、UntypedActorをよく使う➡   UntypedActorはObjectでメッセージを送受信する➡   Scala版では、パターンマッチですっきり書ける    ※Sc...
Akkaのイベントシステムについて(2)➡   Akka Javaでは、メッセージがObjectなので、普通に    書くとこうなるif(message	  instanceof	  Join)	  {	  	  	  	  Join	  jo...
Akka Javaのメッセージパッシング判定(1)➡   イベントはTypesafe Enumで定義しておく    WebSocketのイベントはだいたい決まっているpublic	  enum	  WebSocketEvent	  {	  	 ...
Akka Javaのメッセージパッシング判定(2)➡   イベント処理をScalaっぽく書く    Javaではイベント用のinterfaceと、PlayのOptionと、    Enumを使ってこうなるOption<Message>	  ev...
非同期で渡すCallback、Functionなどは?➡   Java 8を待つ    仕事でもOKになるのは当分先かな...➡   IntelliJ IDEAでごまかして見る    仕事でも使えるw➡                     ...
しかし…、MVCWebフレームワークベースのWebアプリケーションにWebSocketが加わると、すんごい重くなるのでは。                    23
そこで…、Akka Remoteによる並列、分散処理
Akka Remote➡   Akka Remoteを使うと、Akka Actorをリモートで    アクセス可能になる➡   Play 2.1の場合     "com.typesafe.akka" %% "akka-remote" % "2....
Akka Remoteはこれができる(1)➡   設定により、アクターの所在を決めることができるmaster	  {	  	  	  	  akka	  {	  	  	  	  	  	  	  	  actor	  {	  	  	  	 ...
Akka Remoteはこれができる(2)➡   アクターへのリファレンス先が別ホストとかに!//	  アクターのインスタンスpublic	  final	  static	  	  ActorRef	  actor	  =	  	  	  	...
Akka Remoteはこれができる(3)➡   プログラム上からの利用はおなじ!//	  アクターへの問い合わせactor.tell(	  [メッセージオブジェクト]	  ,	  getSelf());                    ...
すごくシンプルなサンプル➡   Playが2つ起動    それぞれにアクターがいる➡   片方のPlayにアクセスがあると    URLに書かれたパラメータを、もう一方のアクターに    tellする➡   送受信したメッセージがそれぞれターミ...
Akka RemoteとWebSocket➡   WebSocketは、どうしても接続用サーバに    負荷がかかる    モデルとかログとか別サーバーに、プログラマブルな形で透過的に使いたい➡   リアルタイムアプリケーションは、    同時...
Actor RemoteによるMVCの分散    Database                 ViewModel                               Actor      Actor               M...
ありがとうございました!!  次のPlayはじめて&もくもく会は4月14日(日) 10時00分 - 18時00分            [Play部屋] 第11回 Play 2.1 はじめて&もくもく会                     ...
Upcoming SlideShare
Loading in …5
×

WebSocket+Akka(Remote)+Play 2.1 Java

4,944 views

Published on

SPDY+WS勉強会で発表した資料です

  • Be the first to comment

WebSocket+Akka(Remote)+Play 2.1 Java

  1. 1. SPDY+WS勉強会(仮) WebSocket + Akka (Remote) +Play framework 2.1 Java 原 一浩 @kara_d
  2. 2. 自己紹介 ハラ カズヒロ 原 一浩 ( @kara_d ) グレーティブ合同会社代表 http://greative.jp/ Playはじめて&もくもく会主宰 Scala conferenceスポンサー 日本Play frameworkユーザー会参加 コワーキングスペース茅場町Co-Edo 2
  3. 3. アジェンダ➡ Play 2.1 JavaとWebSocket➡ Akkaについて➡ WebSocketとAkkaとJava➡ Akka Remoteによる並列、分散処理 ※今回は、文字数節約のためにPlay 2.1 JavaのことをPlayと呼ぶことに  しました 3
  4. 4. Play 2.1 JavaとWebSocket
  5. 5. Play frameworkとは?➡ Zenexity(フランスの会社)➡ Typesafe(Scala総本山、Martin Odersky氏など)特徴とされているもの➡ ノンブロッキングIO採用➡ パワフルなコンソールとシンプルなビルドツール➡ ステートレスかつウェブ向き➡ 型安全的➡ IDEサポート➡ Java/Scalaで開発➡ モジュール的の高いフルスタックFW 5
  6. 6. Play バージョン 2.xについて➡ ∼2012/2 Play 1.x:Javaベース、Groovyテンプレート、 Hibernate独自拡張、 Pythonによるビルドシステム、WebSocketは1.2から➡ 2012/2 Play 2.0:Scalaベース、Java/Scala両方で開発可能、 JavaのORMはEBean、Scalaテンプレート、SBTによるビルド➡ 2013/2 Play 2.1:フォルダやビルド構成の見直し、 各種ライブラリのバージョンアップ、Scalaのバージョンアップ 6
  7. 7. PlayでWebSocketコンテンツの魅力➡ MVCFWを使ったのWebアプリケーションに ちょこっと導入とかもできちゃう 普通のコントローラーと同じ感覚でWebSocketの処理を書ける ルーティングも同じ感じ➡ 必要に応じて分散処理を組める Akkaつかう 7
  8. 8. シンプルなWebSocketサンプル➡ ハンズオンでやったもの 8
  9. 9. SPDYサポート周り➡ Using SPDY and HTTP transparently using Netty ¦ Smartjava.org http://www.smartjava.org/content/using-spdy-and-http- transparently-using-netty➡ Nettyが3.3.1でSPDYに対応したぽいので がんばればできるのかも 9
  10. 10. Akkaについて
  11. 11. Akkaってなに?➡ Typesafe社の開発➡ アクターモデルをベースにした非同期処理、並行処理➡ リモーティングによる分散処理➡ アクターの管理と耐障害性(let-it-crash)➡ 設定との分離によって位置透過性を担保➡ ソフトウェアトランザクショナルメモリ➡ 非同期、スケジューリング、イベント処理にも使える 11
  12. 12. ActorRef … アクターのキモ➡ Akkaのアクターへの参照➡ アクターモデル 並行計算の数学的モデルの一種 アクターモデルの基本は「全てのものはアクターである」という哲学 アクターは並行的に受信するメッセージに対応した以下のような振る舞いを備えた計算実体(Computational Entity)である 他のアクターとの通信は非同期に発生する - wikipedia Actor Actor onReceive(o) ( Object ) onReceive(o) Do 12
  13. 13. アクターへのメッセージパッシング➡ tellとaskがある tell なげっぱ。fire-and-forget。 void tell(Object msg, ActorRef sender) ask Future型でかえってくる Future ask(ActorRef actor, Object message, long timeout) 13
  14. 14. PlayとWebSocketとAkka➡ Playでは、WebSocketを使う場合、 ハンドシェイク時、通信が発生した時の イベント送出に利用 あと、裏でいろいろ動く非同期系 14
  15. 15. WebSocketとAkkaとJava
  16. 16. Play 2.1 Java + WebSocketの全体像 Model JsonNode ActorRef onReceive(o) Out Client Handshake Controllertell(Object message) WebSocket<T> JavaScript onReady() WebSocket In JsonNode onMessage() onClose() 16
  17. 17. Play WebSocket with Akkaまとめ➡ 通信は双方向かつリアルタイムに行われる(普通)➡ WebSocketにはInとOutがある WebSocket.In<JsonNode> in WebSocket.Out<JsonNode> out➡ JSON or String(つまりTextFrame)で 通信をしている(BinaryFrameとか、MixedFrameとかも)➡ 非同期なイベントを管理するためにAkkaを使う (使わないこともできる) 17
  18. 18. Akkaのイベントシステムについて(1)➡ Akka Javaは、UntypedActorをよく使う➡ UntypedActorはObjectでメッセージを送受信する➡ Scala版では、パターンマッチですっきり書ける ※Scala版はObject型というわけではないdef  receive  =  {    case  Join(username)  =>  {  ...  }    case  Talk(username,  text)  =>  {  ...  }    case  Quit(username)  =>  {  ...  }} 18
  19. 19. Akkaのイベントシステムについて(2)➡ Akka Javaでは、メッセージがObjectなので、普通に 書くとこうなるif(message  instanceof  Join)  {        Join  join  =  (Join)message;        ...}  else  if(message  instanceof  Talk)    {        Talk  talk  =  (Talk)message;        ...}  else  if(message  instanceof  Quit)    {        Quit  quit  =  (Quit)message;        ...}  else  {        unhandled(message);} 19
  20. 20. Akka Javaのメッセージパッシング判定(1)➡ イベントはTypesafe Enumで定義しておく WebSocketのイベントはだいたい決まっているpublic  enum  WebSocketEvent  {        JOIN        {  String  init()  {  return  ...        }  },        MESSAGE  {  String  init()  {  return  ...        }  },        QUIT        {  String  init()  {  return  ...        }  };        abstract  String  init();} 20
  21. 21. Akka Javaのメッセージパッシング判定(2)➡ イベント処理をScalaっぽく書く Javaではイベント用のinterfaceと、PlayのOptionと、 Enumを使ってこうなるOption<Message>  event  =  EventUtil.getEvent(message);if(event.isDefined()){        switch  (event.get().getEventType())  {                case  JOIN:        ...  break;                case  MESSAGE:  ...  break;                case  QUIT:        ...  break;                default:  unhandled(message);  break;        }} 21
  22. 22. 非同期で渡すCallback、Functionなどは?➡ Java 8を待つ 仕事でもOKになるのは当分先かな...➡ IntelliJ IDEAでごまかして見る 仕事でも使えるw➡ 22
  23. 23. しかし…、MVCWebフレームワークベースのWebアプリケーションにWebSocketが加わると、すんごい重くなるのでは。 23
  24. 24. そこで…、Akka Remoteによる並列、分散処理
  25. 25. Akka Remote➡ Akka Remoteを使うと、Akka Actorをリモートで アクセス可能になる➡ Play 2.1の場合 "com.typesafe.akka" %% "akka-remote" % "2.1.2"➡ 通信は、TCPやUDPが使える➡ セキュリティ対応も可能 25
  26. 26. Akka Remoteはこれができる(1)➡ 設定により、アクターの所在を決めることができるmaster  {        akka  {                actor  {                        provider  =  "akka.remote.RemoteActorRefProvider"                }                remote  {                        transport  =  "akka.remote.netty.NettyRemoteTransport"                        netty  {                                hostname  =  "127.0.0.1"                                port  =  0                        }                }        }} 26
  27. 27. Akka Remoteはこれができる(2)➡ アクターへのリファレンス先が別ホストとかに!//  アクターのインスタンスpublic  final  static    ActorRef  actor  =          system.actorFor("akka://master2@127.0.0.1:2258/user/master2"); 27
  28. 28. Akka Remoteはこれができる(3)➡ プログラム上からの利用はおなじ!//  アクターへの問い合わせactor.tell(  [メッセージオブジェクト]  ,  getSelf()); 28
  29. 29. すごくシンプルなサンプル➡ Playが2つ起動 それぞれにアクターがいる➡ 片方のPlayにアクセスがあると URLに書かれたパラメータを、もう一方のアクターに tellする➡ 送受信したメッセージがそれぞれターミナルに表示 29
  30. 30. Akka RemoteとWebSocket➡ WebSocketは、どうしても接続用サーバに 負荷がかかる モデルとかログとか別サーバーに、プログラマブルな形で透過的に使いたい➡ リアルタイムアプリケーションは、 同時にいろいろなことが発生する 並行処理をAkka Remoteに非同期にまかせる 30
  31. 31. Actor RemoteによるMVCの分散 Database ViewModel Actor Actor Message Model Controller Message Actor Actor Log Actor 31
  32. 32. ありがとうございました!! 次のPlayはじめて&もくもく会は4月14日(日) 10時00分 - 18時00分 [Play部屋] 第11回 Play 2.1 はじめて&もくもく会 日本Playframeworkユーザー会 http://playframeworkja.doorkeeper.jp/events/3414 参加料:会場利用代 ¥1,000

×