SPDY+WS勉強会(仮)

             WebSocket
      + Akka (Remote) +
Play framework 2.1 Java


      原 一浩       @kara_d
自己紹介
       ハラ カズヒロ

       原 一浩      ( @kara_d )
       グレーティブ合同会社代表
       http://greative.jp/

       Playはじめて&もくもく会主宰
       Scala conferenceスポンサー
       日本Play frameworkユーザー会参加
       コワーキングスペース茅場町Co-Edo




                                 2
アジェンダ
➡   Play 2.1 JavaとWebSocket
➡   Akkaについて
➡   WebSocketとAkkaとJava
➡   Akka Remoteによる並列、分散処理




    ※今回は、文字数節約のためにPlay 2.1 JavaのことをPlayと呼ぶことに
     しました
                                                3
Play 2.1 JavaとWebSocket
Play frameworkとは?
➡   Zenexity(フランスの会社)
➡   Typesafe(Scala総本山、Martin Odersky氏など)

特徴とされているもの
➡   ノンブロッキングIO採用
➡   パワフルなコンソールとシンプルなビルドツール
➡   ステートレスかつウェブ向き
➡   型安全的
➡   IDEサポート
➡   Java/Scalaで開発
➡   モジュール的の高いフルスタックFW
                                           5
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
PlayでWebSocketコンテンツの魅力
➡   MVCFWを使ったのWebアプリケーションに
    ちょこっと導入とかもできちゃう
    普通のコントローラーと同じ感覚でWebSocketの処理を書ける
    ルーティングも同じ感じ

➡   必要に応じて分散処理を組める
    Akkaつかう




                                       7
シンプルなWebSocketサンプル
➡   ハンズオンでやったもの




                     8
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
Akkaについて
Akkaってなに?
➡   Typesafe社の開発
➡   アクターモデルをベースにした非同期処理、並行処理
➡   リモーティングによる分散処理
➡   アクターの管理と耐障害性(let-it-crash)
➡   設定との分離によって位置透過性を担保
➡   ソフトウェアトランザクショナルメモリ
➡   非同期、スケジューリング、イベント処理にも使える




                                 11
ActorRef … アクターのキモ
➡   Akkaのアクターへの参照
➡   アクターモデル
    並行計算の数学的モデルの一種

    アクターモデルの基本は「全てのものはアクターである」という哲学

    アクターは並行的に受信するメッセージに対応した以下のような振る舞いを備えた計算実体(Computational
    Entity)である

    他のアクターとの通信は非同期に発生する

    - wikipedia




         Actor                          Actor
        onReceive(o)
                       (   Object   )   onReceive(o)
                                                       Do


                                                            12
アクターへのメッセージパッシング
➡   tellとaskがある
    tell
      なげっぱ。fire-and-forget。
           void tell(Object msg, ActorRef sender)

    ask
      Future型でかえってくる
           Future ask(ActorRef actor, Object message, long timeout)




                                                                      13
PlayとWebSocketとAkka
➡   Playでは、WebSocketを使う場合、
    ハンドシェイク時、通信が発生した時の
    イベント送出に利用
    あと、裏でいろいろ動く非同期系




                             14
WebSocketとAkkaとJava
Play 2.1 Java + WebSocketの全体像



        Model             JsonNode
        ActorRef
      onReceive(o)                      Out



                                                          Client
                                              Handshake
                          Controller
tell(Object message)     WebSocket<T>
                                                          JavaScript
                          onReady()
                                              WebSocket



          In         JsonNode

      onMessage()
       onClose()




                                                                       16
Play WebSocket with Akkaまとめ
➡   通信は双方向かつリアルタイムに行われる(普通)
➡   WebSocketにはInとOutがある
    WebSocket.In<JsonNode> in
    WebSocket.Out<JsonNode> out

➡   JSON or String(つまりTextFrame)で
    通信をしている(BinaryFrameとか、MixedFrameとかも)
➡   非同期なイベントを管理するためにAkkaを使う
    (使わないこともできる)




                                           17
Akkaのイベントシステムについて(1)
➡   Akka Javaは、UntypedActorをよく使う
➡   UntypedActorはObjectでメッセージを送受信する
➡   Scala版では、パターンマッチですっきり書ける
    ※Scala版はObject型というわけではない


def	
  receive	
  =	
  {
	
  	
  case	
  Join(username)	
  =>	
  {	
  ...	
  }
	
  	
  case	
  Talk(username,	
  text)	
  =>	
  {	
  ...	
  }
	
  	
  case	
  Quit(username)	
  =>	
  {	
  ...	
  }
}




                                                                 18
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
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
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
非同期で渡すCallback、Functionなどは?
➡   Java 8を待つ
    仕事でもOKになるのは当分先かな...

➡   IntelliJ IDEAでごまかして見る
    仕事でも使えるw




➡




                              22
しかし…、
MVCWebフレームワークベースの
Webアプリケーションに
WebSocketが加わると、
すんごい重くなるのでは。




                    23
そこで…、
Akka Remoteによる並列、分散処理
Akka Remote
➡   Akka Remoteを使うと、Akka Actorをリモートで
    アクセス可能になる
➡   Play 2.1の場合

     "com.typesafe.akka" %% "akka-remote" % "2.1.2"




➡   通信は、TCPやUDPが使える
➡   セキュリティ対応も可能




                                                      25
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
Akka Remoteはこれができる(2)
➡   アクターへのリファレンス先が別ホストとかに!

//	
  アクターのインスタンス
public	
  final	
  static	
  	
  ActorRef	
  actor	
  =	
  
	
  	
  	
  	
  system.actorFor("akka://master2@127.0.0.1:2258/user/master2");




                                                                                 27
Akka Remoteはこれができる(3)
➡   プログラム上からの利用はおなじ!

//	
  アクターへの問い合わせ
actor.tell(	
  [メッセージオブジェクト]	
  ,	
  getSelf());




                                                   28
すごくシンプルなサンプル
➡   Playが2つ起動
    それぞれにアクターがいる

➡   片方のPlayにアクセスがあると
    URLに書かれたパラメータを、もう一方のアクターに
    tellする
➡   送受信したメッセージがそれぞれターミナルに表示




                                29
Akka RemoteとWebSocket
➡   WebSocketは、どうしても接続用サーバに
    負荷がかかる
    モデルとかログとか別サーバーに、プログラマブルな形で透過的に使いたい

➡   リアルタイムアプリケーションは、
    同時にいろいろなことが発生する
    並行処理をAkka Remoteに非同期にまかせる




                                         30
Actor RemoteによるMVCの分散


    Database                 ViewModel


                               Actor
      Actor
               Message




                    Model                Controller

                              Message
                     Actor                 Actor
      Log


      Actor




                                                      31
ありがとうございました!!
  次のPlayはじめて&もくもく会は
4月14日(日) 10時00分 - 18時00分
            [Play部屋] 第11回 Play 2.1 はじめて&もくもく会
                          日本Playframeworkユーザー会
    http://playframeworkja.doorkeeper.jp/events/3414
                              参加料:会場利用代 ¥1,000

WebSocket+Akka(Remote)+Play 2.1 Java

  • 1.
    SPDY+WS勉強会(仮) WebSocket + Akka (Remote) + Play framework 2.1 Java 原 一浩 @kara_d
  • 2.
    自己紹介 ハラ カズヒロ 原 一浩 ( @kara_d ) グレーティブ合同会社代表 http://greative.jp/ Playはじめて&もくもく会主宰 Scala conferenceスポンサー 日本Play frameworkユーザー会参加 コワーキングスペース茅場町Co-Edo 2
  • 3.
    アジェンダ ➡ Play 2.1 JavaとWebSocket ➡ Akkaについて ➡ WebSocketとAkkaとJava ➡ Akka Remoteによる並列、分散処理 ※今回は、文字数節約のためにPlay 2.1 JavaのことをPlayと呼ぶことに  しました 3
  • 4.
  • 5.
    Play frameworkとは? ➡ Zenexity(フランスの会社) ➡ Typesafe(Scala総本山、Martin Odersky氏など) 特徴とされているもの ➡ ノンブロッキングIO採用 ➡ パワフルなコンソールとシンプルなビルドツール ➡ ステートレスかつウェブ向き ➡ 型安全的 ➡ IDEサポート ➡ Java/Scalaで開発 ➡ モジュール的の高いフルスタックFW 5
  • 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.
    PlayでWebSocketコンテンツの魅力 ➡ MVCFWを使ったのWebアプリケーションに ちょこっと導入とかもできちゃう 普通のコントローラーと同じ感覚でWebSocketの処理を書ける ルーティングも同じ感じ ➡ 必要に応じて分散処理を組める Akkaつかう 7
  • 8.
    シンプルなWebSocketサンプル ➡ ハンズオンでやったもの 8
  • 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.
  • 11.
    Akkaってなに? ➡ Typesafe社の開発 ➡ アクターモデルをベースにした非同期処理、並行処理 ➡ リモーティングによる分散処理 ➡ アクターの管理と耐障害性(let-it-crash) ➡ 設定との分離によって位置透過性を担保 ➡ ソフトウェアトランザクショナルメモリ ➡ 非同期、スケジューリング、イベント処理にも使える 11
  • 12.
    ActorRef … アクターのキモ ➡ Akkaのアクターへの参照 ➡ アクターモデル 並行計算の数学的モデルの一種 アクターモデルの基本は「全てのものはアクターである」という哲学 アクターは並行的に受信するメッセージに対応した以下のような振る舞いを備えた計算実体(Computational Entity)である 他のアクターとの通信は非同期に発生する - wikipedia Actor Actor onReceive(o) ( Object ) onReceive(o) Do 12
  • 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.
    PlayとWebSocketとAkka ➡ Playでは、WebSocketを使う場合、 ハンドシェイク時、通信が発生した時の イベント送出に利用 あと、裏でいろいろ動く非同期系 14
  • 15.
  • 16.
    Play 2.1 Java+ WebSocketの全体像 Model JsonNode ActorRef onReceive(o) Out Client Handshake Controller tell(Object message) WebSocket<T> JavaScript onReady() WebSocket In JsonNode onMessage() onClose() 16
  • 17.
    Play WebSocket withAkkaまとめ ➡ 通信は双方向かつリアルタイムに行われる(普通) ➡ WebSocketにはInとOutがある WebSocket.In<JsonNode> in WebSocket.Out<JsonNode> out ➡ JSON or String(つまりTextFrame)で 通信をしている(BinaryFrameとか、MixedFrameとかも) ➡ 非同期なイベントを管理するためにAkkaを使う (使わないこともできる) 17
  • 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.
    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.
    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.
    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.
    非同期で渡すCallback、Functionなどは? ➡ Java 8を待つ 仕事でもOKになるのは当分先かな... ➡ IntelliJ IDEAでごまかして見る 仕事でも使えるw ➡ 22
  • 23.
  • 24.
  • 25.
    Akka Remote ➡ Akka Remoteを使うと、Akka Actorをリモートで アクセス可能になる ➡ Play 2.1の場合 "com.typesafe.akka" %% "akka-remote" % "2.1.2" ➡ 通信は、TCPやUDPが使える ➡ セキュリティ対応も可能 25
  • 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.
    Akka Remoteはこれができる(2) ➡ アクターへのリファレンス先が別ホストとかに! //  アクターのインスタンス public  final  static    ActorRef  actor  =          system.actorFor("akka://master2@127.0.0.1:2258/user/master2"); 27
  • 28.
    Akka Remoteはこれができる(3) ➡ プログラム上からの利用はおなじ! //  アクターへの問い合わせ actor.tell(  [メッセージオブジェクト]  ,  getSelf()); 28
  • 29.
    すごくシンプルなサンプル ➡ Playが2つ起動 それぞれにアクターがいる ➡ 片方のPlayにアクセスがあると URLに書かれたパラメータを、もう一方のアクターに tellする ➡ 送受信したメッセージがそれぞれターミナルに表示 29
  • 30.
    Akka RemoteとWebSocket ➡ WebSocketは、どうしても接続用サーバに 負荷がかかる モデルとかログとか別サーバーに、プログラマブルな形で透過的に使いたい ➡ リアルタイムアプリケーションは、 同時にいろいろなことが発生する 並行処理をAkka Remoteに非同期にまかせる 30
  • 31.
    Actor RemoteによるMVCの分散 Database ViewModel Actor Actor Message Model Controller Message Actor Actor Log Actor 31
  • 32.
    ありがとうございました!! 次のPlayはじめて&もくもく会は 4月14日(日)10時00分 - 18時00分 [Play部屋] 第11回 Play 2.1 はじめて&もくもく会 日本Playframeworkユーザー会 http://playframeworkja.doorkeeper.jp/events/3414 参加料:会場利用代 ¥1,000