SlideShare a Scribd company logo
1 of 32
Download to read offline
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

More Related Content

What's hot

akka-doc-ja
akka-doc-jaakka-doc-ja
akka-doc-jaTIS Inc.
 
Akkaの翻訳みんなでやろう Let's translate akka doc
Akkaの翻訳みんなでやろう Let's translate akka docAkkaの翻訳みんなでやろう Let's translate akka doc
Akkaの翻訳みんなでやろう Let's translate akka doc賢太郎 前多
 
【LT】akka receive とScala Javaの違い
【LT】akka receive とScala Javaの違い 【LT】akka receive とScala Javaの違い
【LT】akka receive とScala Javaの違い 賢太郎 前多
 
Developing an Akka Edge6
Developing an Akka Edge6Developing an Akka Edge6
Developing an Akka Edge6saaaaaaki
 
Servlet と Future の関わり方 #scala_ks
Servlet と Future の関わり方 #scala_ksServlet と Future の関わり方 #scala_ks
Servlet と Future の関わり方 #scala_ksKazuhiro Sera
 
Real world android akka
Real world android akkaReal world android akka
Real world android akkaTaisuke Oe
 
Developing an Akka Edge1-3
Developing an Akka Edge1-3Developing an Akka Edge1-3
Developing an Akka Edge1-3saaaaaaki
 
Developing an Akka Edge4-5
Developing an Akka Edge4-5Developing an Akka Edge4-5
Developing an Akka Edge4-5saaaaaaki
 
Scala警察のすすめ
Scala警察のすすめScala警察のすすめ
Scala警察のすすめtakezoe
 
The state of sbt 0.13, sbt server, and sbt 1.0 (ScalaMatsuri ver)
The state of sbt 0.13, sbt server, and sbt 1.0 (ScalaMatsuri ver)The state of sbt 0.13, sbt server, and sbt 1.0 (ScalaMatsuri ver)
The state of sbt 0.13, sbt server, and sbt 1.0 (ScalaMatsuri ver)Eugene Yokota
 
Real World Android Akka - 日本語版
Real World Android Akka - 日本語版Real World Android Akka - 日本語版
Real World Android Akka - 日本語版Taisuke Oe
 
Seasar ユーザだったプログラマが目指す OSS の世界展開 #seasarcon
Seasar ユーザだったプログラマが目指す OSS の世界展開 #seasarconSeasar ユーザだったプログラマが目指す OSS の世界展開 #seasarcon
Seasar ユーザだったプログラマが目指す OSS の世界展開 #seasarconKazuhiro Sera
 
Quasar: Actor Model and Light Weight Threads on Java
Quasar: Actor Model and Light Weight Threads on JavaQuasar: Actor Model and Light Weight Threads on Java
Quasar: Actor Model and Light Weight Threads on JavaTaku Miyakawa
 
Scala Warrior and type-safe front-end development with Scala.js
Scala Warrior and type-safe front-end development with Scala.jsScala Warrior and type-safe front-end development with Scala.js
Scala Warrior and type-safe front-end development with Scala.jstakezoe
 
Sbtのマルチプロジェクトはいいぞ
SbtのマルチプロジェクトはいいぞSbtのマルチプロジェクトはいいぞ
SbtのマルチプロジェクトはいいぞYoshitaka Fujii
 
ScalaにまつわるNewsな話
ScalaにまつわるNewsな話ScalaにまつわるNewsな話
ScalaにまつわるNewsな話Yosuke Mizutani
 
ネタじゃないScala.js
ネタじゃないScala.jsネタじゃないScala.js
ネタじゃないScala.jstakezoe
 
Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回
Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回
Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回Asami Abe
 
PlaySQLAlchemyORM2017.key
PlaySQLAlchemyORM2017.keyPlaySQLAlchemyORM2017.key
PlaySQLAlchemyORM2017.key泰 増田
 

What's hot (20)

akka-doc-ja
akka-doc-jaakka-doc-ja
akka-doc-ja
 
Akkaの翻訳みんなでやろう Let's translate akka doc
Akkaの翻訳みんなでやろう Let's translate akka docAkkaの翻訳みんなでやろう Let's translate akka doc
Akkaの翻訳みんなでやろう Let's translate akka doc
 
【LT】akka receive とScala Javaの違い
【LT】akka receive とScala Javaの違い 【LT】akka receive とScala Javaの違い
【LT】akka receive とScala Javaの違い
 
Developing an Akka Edge6
Developing an Akka Edge6Developing an Akka Edge6
Developing an Akka Edge6
 
Servlet と Future の関わり方 #scala_ks
Servlet と Future の関わり方 #scala_ksServlet と Future の関わり方 #scala_ks
Servlet と Future の関わり方 #scala_ks
 
Real world android akka
Real world android akkaReal world android akka
Real world android akka
 
Developing an Akka Edge1-3
Developing an Akka Edge1-3Developing an Akka Edge1-3
Developing an Akka Edge1-3
 
Developing an Akka Edge4-5
Developing an Akka Edge4-5Developing an Akka Edge4-5
Developing an Akka Edge4-5
 
Scala警察のすすめ
Scala警察のすすめScala警察のすすめ
Scala警察のすすめ
 
The state of sbt 0.13, sbt server, and sbt 1.0 (ScalaMatsuri ver)
The state of sbt 0.13, sbt server, and sbt 1.0 (ScalaMatsuri ver)The state of sbt 0.13, sbt server, and sbt 1.0 (ScalaMatsuri ver)
The state of sbt 0.13, sbt server, and sbt 1.0 (ScalaMatsuri ver)
 
Real World Android Akka - 日本語版
Real World Android Akka - 日本語版Real World Android Akka - 日本語版
Real World Android Akka - 日本語版
 
Seasar ユーザだったプログラマが目指す OSS の世界展開 #seasarcon
Seasar ユーザだったプログラマが目指す OSS の世界展開 #seasarconSeasar ユーザだったプログラマが目指す OSS の世界展開 #seasarcon
Seasar ユーザだったプログラマが目指す OSS の世界展開 #seasarcon
 
Quasar: Actor Model and Light Weight Threads on Java
Quasar: Actor Model and Light Weight Threads on JavaQuasar: Actor Model and Light Weight Threads on Java
Quasar: Actor Model and Light Weight Threads on Java
 
Scala Warrior and type-safe front-end development with Scala.js
Scala Warrior and type-safe front-end development with Scala.jsScala Warrior and type-safe front-end development with Scala.js
Scala Warrior and type-safe front-end development with Scala.js
 
Sbtのマルチプロジェクトはいいぞ
SbtのマルチプロジェクトはいいぞSbtのマルチプロジェクトはいいぞ
Sbtのマルチプロジェクトはいいぞ
 
ScalaにまつわるNewsな話
ScalaにまつわるNewsな話ScalaにまつわるNewsな話
ScalaにまつわるNewsな話
 
ネタじゃないScala.js
ネタじゃないScala.jsネタじゃないScala.js
ネタじゃないScala.js
 
とりあえず使えるSBT
とりあえず使えるSBTとりあえず使えるSBT
とりあえず使えるSBT
 
Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回
Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回
Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回
 
PlaySQLAlchemyORM2017.key
PlaySQLAlchemyORM2017.keyPlaySQLAlchemyORM2017.key
PlaySQLAlchemyORM2017.key
 

Similar to WebSocket+Akka(Remote)+Play 2.1 Java

R5 3 type annotation
R5 3 type annotationR5 3 type annotation
R5 3 type annotationEIICHI KIMURA
 
Web socketドロンくん その後-
Web socketドロンくん その後-Web socketドロンくん その後-
Web socketドロンくん その後-Yuuichi Akagawa
 
SDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireSDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireAkio Katayama
 
マイクラ自動化枠第1回資料
マイクラ自動化枠第1回資料マイクラ自動化枠第1回資料
マイクラ自動化枠第1回資料Ryo Fujita
 
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)JPCERT Coordination Center
 
PlayFramework1.2.4におけるWebSocket
PlayFramework1.2.4におけるWebSocketPlayFramework1.2.4におけるWebSocket
PlayFramework1.2.4におけるWebSocketKazuhiro Hara
 
覚醒JavaScript -ES6で作るIsomophicアプリケーション-
覚醒JavaScript  -ES6で作るIsomophicアプリケーション-覚醒JavaScript  -ES6で作るIsomophicアプリケーション-
覚醒JavaScript -ES6で作るIsomophicアプリケーション-Oonishi Keitarou
 
node+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作るnode+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作るKiyoshi SATOH
 
Play framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレードPlay framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレードKazuhiro Hara
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」yoshiaki iwanaga
 
Inside frogc in Dart
Inside frogc in DartInside frogc in Dart
Inside frogc in DartGoro Fuji
 
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2DToshiyuki Ienaga
 
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい) 泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい) Akihiro Kuwano
 
明日から使える Java SE 7
明日から使える Java SE 7明日から使える Java SE 7
明日から使える Java SE 7Yuichi Sakuraba
 
WebRTC meetup Tokyo 1
WebRTC meetup  Tokyo 1WebRTC meetup  Tokyo 1
WebRTC meetup Tokyo 1mganeko
 
あの日実行したコンテナの名前を僕達はまだ知らない。
あの日実行したコンテナの名前を僕達はまだ知らない。あの日実行したコンテナの名前を僕達はまだ知らない。
あの日実行したコンテナの名前を僕達はまだ知らない。Masahito Zembutsu
 

Similar to WebSocket+Akka(Remote)+Play 2.1 Java (20)

Play jjug2012spring
Play jjug2012springPlay jjug2012spring
Play jjug2012spring
 
R5 3 type annotation
R5 3 type annotationR5 3 type annotation
R5 3 type annotation
 
ATN No.2 Scala事始め
ATN No.2 Scala事始めATN No.2 Scala事始め
ATN No.2 Scala事始め
 
Web socketドロンくん その後-
Web socketドロンくん その後-Web socketドロンくん その後-
Web socketドロンくん その後-
 
Heap statsfx analyzer
Heap statsfx analyzerHeap statsfx analyzer
Heap statsfx analyzer
 
SDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireSDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 Whire
 
マイクラ自動化枠第1回資料
マイクラ自動化枠第1回資料マイクラ自動化枠第1回資料
マイクラ自動化枠第1回資料
 
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
 
PlayFramework1.2.4におけるWebSocket
PlayFramework1.2.4におけるWebSocketPlayFramework1.2.4におけるWebSocket
PlayFramework1.2.4におけるWebSocket
 
MlnagoyaRx
MlnagoyaRxMlnagoyaRx
MlnagoyaRx
 
覚醒JavaScript -ES6で作るIsomophicアプリケーション-
覚醒JavaScript  -ES6で作るIsomophicアプリケーション-覚醒JavaScript  -ES6で作るIsomophicアプリケーション-
覚醒JavaScript -ES6で作るIsomophicアプリケーション-
 
node+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作るnode+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作る
 
Play framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレードPlay framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレード
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
 
Inside frogc in Dart
Inside frogc in DartInside frogc in Dart
Inside frogc in Dart
 
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
 
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい) 泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
 
明日から使える Java SE 7
明日から使える Java SE 7明日から使える Java SE 7
明日から使える Java SE 7
 
WebRTC meetup Tokyo 1
WebRTC meetup  Tokyo 1WebRTC meetup  Tokyo 1
WebRTC meetup Tokyo 1
 
あの日実行したコンテナの名前を僕達はまだ知らない。
あの日実行したコンテナの名前を僕達はまだ知らない。あの日実行したコンテナの名前を僕達はまだ知らない。
あの日実行したコンテナの名前を僕達はまだ知らない。
 

More from Kazuhiro Hara

About Plone Conference Tokyo 2018 Frontend Day
About Plone Conference Tokyo 2018 Frontend DayAbout Plone Conference Tokyo 2018 Frontend Day
About Plone Conference Tokyo 2018 Frontend DayKazuhiro Hara
 
Gatsby & React Static
Gatsby & React StaticGatsby & React Static
Gatsby & React StaticKazuhiro Hara
 
buddyのユーザ認証周りのデータ構造 - 使われているデータの取り回しについてのお話
buddyのユーザ認証周りのデータ構造 - 使われているデータの取り回しについてのお話buddyのユーザ認証周りのデータ構造 - 使われているデータの取り回しについてのお話
buddyのユーザ認証周りのデータ構造 - 使われているデータの取り回しについてのお話Kazuhiro Hara
 
Clojure.tokyo.descjop
Clojure.tokyo.descjopClojure.tokyo.descjop
Clojure.tokyo.descjopKazuhiro Hara
 
SwaggerとAPIのデザイン
SwaggerとAPIのデザインSwaggerとAPIのデザイン
SwaggerとAPIのデザインKazuhiro Hara
 
React VR ことはじめ
React VR ことはじめReact VR ことはじめ
React VR ことはじめKazuhiro Hara
 
React系(別言語含む)の サーバーサイドレンダリング について考えよう
React系(別言語含む)の サーバーサイドレンダリング について考えようReact系(別言語含む)の サーバーサイドレンダリング について考えよう
React系(別言語含む)の サーバーサイドレンダリング について考えようKazuhiro Hara
 
Clojure の各種React系ラッパーライブラリのサーバーサイドレンダリングの現状について
Clojure の各種React系ラッパーライブラリのサーバーサイドレンダリングの現状についてClojure の各種React系ラッパーライブラリのサーバーサイドレンダリングの現状について
Clojure の各種React系ラッパーライブラリのサーバーサイドレンダリングの現状についてKazuhiro Hara
 
Re-frame and A-Frame
Re-frame and A-FrameRe-frame and A-Frame
Re-frame and A-FrameKazuhiro Hara
 
ひとりアドベントカレンダーのご紹介
ひとりアドベントカレンダーのご紹介ひとりアドベントカレンダーのご紹介
ひとりアドベントカレンダーのご紹介Kazuhiro Hara
 
(IDEユーザのための) ClojureのEmacs開発環境について
(IDEユーザのための) ClojureのEmacs開発環境について(IDEユーザのための) ClojureのEmacs開発環境について
(IDEユーザのための) ClojureのEmacs開発環境についてKazuhiro Hara
 
Cryogenでサイトつくろーじぇん
CryogenでサイトつくろーじぇんCryogenでサイトつくろーじぇん
CryogenでサイトつくろーじぇんKazuhiro Hara
 
ClojureでElectronアプリを作ろう
ClojureでElectronアプリを作ろうClojureでElectronアプリを作ろう
ClojureでElectronアプリを作ろうKazuhiro Hara
 
第2回 -Play部屋- Play 2.0はじめて&もくもく会
第2回 -Play部屋- Play 2.0はじめて&もくもく会第2回 -Play部屋- Play 2.0はじめて&もくもく会
第2回 -Play部屋- Play 2.0はじめて&もくもく会Kazuhiro Hara
 
-Play部屋- Play 2.0はじめて&もくもく会
-Play部屋- Play 2.0はじめて&もくもく会-Play部屋- Play 2.0はじめて&もくもく会
-Play部屋- Play 2.0はじめて&もくもく会Kazuhiro Hara
 
sbtマルチプロジェクトビルドの使いどころ
sbtマルチプロジェクトビルドの使いどころsbtマルチプロジェクトビルドの使いどころ
sbtマルチプロジェクトビルドの使いどころKazuhiro Hara
 
Playbay Play 2.0 plugin イロハのイ
Playbay Play 2.0 plugin イロハのイPlaybay Play 2.0 plugin イロハのイ
Playbay Play 2.0 plugin イロハのイKazuhiro Hara
 
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC WebアプリケーションPlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC WebアプリケーションKazuhiro Hara
 

More from Kazuhiro Hara (20)

MDX with Next.js
MDX with Next.jsMDX with Next.js
MDX with Next.js
 
MDX and Next.js
MDX and Next.jsMDX and Next.js
MDX and Next.js
 
About Plone Conference Tokyo 2018 Frontend Day
About Plone Conference Tokyo 2018 Frontend DayAbout Plone Conference Tokyo 2018 Frontend Day
About Plone Conference Tokyo 2018 Frontend Day
 
Gatsby & React Static
Gatsby & React StaticGatsby & React Static
Gatsby & React Static
 
buddyのユーザ認証周りのデータ構造 - 使われているデータの取り回しについてのお話
buddyのユーザ認証周りのデータ構造 - 使われているデータの取り回しについてのお話buddyのユーザ認証周りのデータ構造 - 使われているデータの取り回しについてのお話
buddyのユーザ認証周りのデータ構造 - 使われているデータの取り回しについてのお話
 
Clojure.tokyo.descjop
Clojure.tokyo.descjopClojure.tokyo.descjop
Clojure.tokyo.descjop
 
SwaggerとAPIのデザイン
SwaggerとAPIのデザインSwaggerとAPIのデザイン
SwaggerとAPIのデザイン
 
React VR ことはじめ
React VR ことはじめReact VR ことはじめ
React VR ことはじめ
 
React系(別言語含む)の サーバーサイドレンダリング について考えよう
React系(別言語含む)の サーバーサイドレンダリング について考えようReact系(別言語含む)の サーバーサイドレンダリング について考えよう
React系(別言語含む)の サーバーサイドレンダリング について考えよう
 
Clojure の各種React系ラッパーライブラリのサーバーサイドレンダリングの現状について
Clojure の各種React系ラッパーライブラリのサーバーサイドレンダリングの現状についてClojure の各種React系ラッパーライブラリのサーバーサイドレンダリングの現状について
Clojure の各種React系ラッパーライブラリのサーバーサイドレンダリングの現状について
 
Re-frame and A-Frame
Re-frame and A-FrameRe-frame and A-Frame
Re-frame and A-Frame
 
ひとりアドベントカレンダーのご紹介
ひとりアドベントカレンダーのご紹介ひとりアドベントカレンダーのご紹介
ひとりアドベントカレンダーのご紹介
 
(IDEユーザのための) ClojureのEmacs開発環境について
(IDEユーザのための) ClojureのEmacs開発環境について(IDEユーザのための) ClojureのEmacs開発環境について
(IDEユーザのための) ClojureのEmacs開発環境について
 
Cryogenでサイトつくろーじぇん
CryogenでサイトつくろーじぇんCryogenでサイトつくろーじぇん
Cryogenでサイトつくろーじぇん
 
ClojureでElectronアプリを作ろう
ClojureでElectronアプリを作ろうClojureでElectronアプリを作ろう
ClojureでElectronアプリを作ろう
 
第2回 -Play部屋- Play 2.0はじめて&もくもく会
第2回 -Play部屋- Play 2.0はじめて&もくもく会第2回 -Play部屋- Play 2.0はじめて&もくもく会
第2回 -Play部屋- Play 2.0はじめて&もくもく会
 
-Play部屋- Play 2.0はじめて&もくもく会
-Play部屋- Play 2.0はじめて&もくもく会-Play部屋- Play 2.0はじめて&もくもく会
-Play部屋- Play 2.0はじめて&もくもく会
 
sbtマルチプロジェクトビルドの使いどころ
sbtマルチプロジェクトビルドの使いどころsbtマルチプロジェクトビルドの使いどころ
sbtマルチプロジェクトビルドの使いどころ
 
Playbay Play 2.0 plugin イロハのイ
Playbay Play 2.0 plugin イロハのイPlaybay Play 2.0 plugin イロハのイ
Playbay Play 2.0 plugin イロハのイ
 
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC WebアプリケーションPlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
 

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
  • 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
  • 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
  • 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 with Akkaまとめ ➡ 通信は双方向かつリアルタイムに行われる(普通) ➡ 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
  • 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