Copyright © 2015 TIS Inc. All rights reserved.
Reactive  System  Meetup  in  西新宿
Typesafe  Reactive  Platformで作る
Reactive  System入門
2015.8.18
前出 祐吾  
根来 和輝
Copyright © 2015 TIS Inc. All rights reserved. 2
自己紹介
■ @yugolf	
  
!
■ TIS株式会社	
  
■ 生産革新本部 生産革新部 生産技術R&D室	
  
■ 社内向けエンジニアリング基盤の整備 ▶▶︎
Copyright © 2015 TIS Inc. All rights reserved. 3
TIS、リアクティブコンサルはじめました
http://www.tis.jp/service_solution/goreactive/
Copyright © 2015 TIS Inc. All rights reserved. 4
Agenda
1. 	
  Reactive	
  Systemとは	
  
2. 	
  Reactive	
  Systemのための技術	
  
3. 	
  Reactive体験
Copyright © 2015 TIS Inc. All rights reserved. 5
1.    Reactive	
  Systemとは
Copyright © 2015 TIS Inc. All rights reserved. 6
本日の話
http://www.reactivemanifesto.org/
Reactive	
  Programming:	
  
データの流れ(ストリーム)とデータの値の変化の伝播にフォーカス
したプログラムの設計モデル。	
  
・・・ の話ではない。
Reactive	
  System:
Copyright © 2015 TIS Inc. All rights reserved. 7
Reactive manifesto
絵	
  
!
即応性	
  
弾力性	
  
耐障害性	
  
メッセージ駆動
http://www.reactivemanifesto.org/ja
Copyright © 2015 TIS Inc. All rights reserved. 8
アプリケーションへの高まる要求
50台のサーバで動かしていたけど、クラウド上で
1000コアの環境を作りたいんだ。
レスポンスを得るのに3秒かかるけど、
500ミリ秒くらいにしたいのよ。	
  
それと、年1回の2時間のメンテナンス
なんとかならないかしら。
最初は100ギガくらいだったけど、そ
ろそろペタ行くんじゃないかな。
Copyright © 2015 TIS Inc. All rights reserved. 9
Reactive Systemとは
即応性と、耐障害性と、弾力性と、メッセージ駆動とを備えたシステム
http://www.reactivemanifesto.org/ja
Copyright © 2015 TIS Inc. All rights reserved. 10
Reactive Systemの価値
届けたい価値
手段
支える原理
高レスポンス  
Responsive
伸縮性  
Elastic
耐障害性  
Resilient
メッセージ駆動  
Message-driven
Copyright © 2015 TIS Inc. All rights reserved. Reactive	
  Design	
  Pattern(http://manning.com/kuhn/) 11
Responsive
ユーザーの要求に迅速にレスポンスするシステム
高レスポンス  
Responsive
伸縮性  
Elastic
耐障害性  
Resilient
メッセージ駆動  
Message-driven
届けたい価値
手段
支える原理
✓高レスポンスを維持するため、リソースプランニングを行い、コンポー
ネントの分割・分散を考慮すべき
Copyright © 2015 TIS Inc. All rights reserved. 12
Elastic
通常の負荷時だけでなく、一時的な高負荷状況でも、変動するワークロードに応
じて割り当てるリソースを増加・減少させることで応答時間を一定水準に保つ	
  
高レスポンス  
Responsive
伸縮性  
Elastic
耐障害性  
Resilient
メッセージ駆動  
Message-driven
届けたい価値
手段
支える原理
Reactive	
  Design	
  Pattern(http://manning.com/kuhn/)
✓伸縮性のため、負荷を監視し、その変化に応じて分散する必要がある	
  
✓1つの部品がボトルネックを持ってはいけないし、独立して動作すべき
Copyright © 2015 TIS Inc. All rights reserved. 13
Resilient
部分的な障害が発生した時にもシステム全体を危険にさらすことなく回復さ
せ、高レスポンスを維持する
高レスポンス  
Responsive
伸縮性  
Elastic
耐障害性  
Resilient
メッセージ駆動  
Message-driven
届けたい価値
手段
支える原理
Reactive	
  Design	
  Pattern(http://manning.com/kuhn/)
✓耐障害性を高めるため、故障したコンポーネントを修復したり、代替
となるコンポーネントを再接続するメカニズムが必要
Copyright © 2015 TIS Inc. All rights reserved. 14
Message Driven
メッセージパッシングにより、コンポーネント間を疎結合にする
高レスポンス  
Responsive
伸縮性  
Elastic
耐障害性  
Resilient
メッセージ駆動  
Message-driven
届けたい価値
手段
支える原理
Reactive	
  Design	
  Pattern(http://manning.com/kuhn/)
✓すべてがメッセージ駆動により実現される
Copyright © 2015 TIS Inc. All rights reserved. 15
2.  Reactive	
  Systemのための技術
Copyright © 2015 TIS Inc. All rights reserved. 16
Typesafe Reactive Platform
JavaVM
アプリケーション
	
  AkkaPlay	
  Framework
Scala Java
Slick
高レスポンス  
Responsive
伸縮性  
Elastic
耐障害性  
Resilient
メッセージ駆動  
Message-driven
Copyright © 2015 TIS Inc. All rights reserved. 17
Play Framework
•非同期/ノンブロッキング	
  
•WebSocketサポート	
  
•Railsのような使いやすさ
Copyright © 2015 TIS Inc. All rights reserved. 18
これまで
def index = Action { implicit request =>

Ok(views.html.index())

}
クライアント サーバ
ブロッキ
ング
高レスポンス  
Responsive
伸縮性  
Elastic
耐障害性  
Resilient
メッセージ駆動  
Message-driven
Copyright © 2015 TIS Inc. All rights reserved. 19
Blocking
コーヒーください。
コーヒー1つ∼
は∼い
できた∼
・・・
コーヒーどうぞ∼	
  
100円です。
コーヒーください。
コーヒー1つ∼
Block
Copyright © 2015 TIS Inc. All rights reserved. 20
Non-blocking
コーヒーください。
コーヒー1つ∼
は∼い
コーヒーどうぞ∼	
  
コーヒーください。
コーヒー1つ∼
100円です。
100円です。
は∼い
できた∼
コーヒーください。
Copyright © 2015 TIS Inc. All rights reserved. 21
Reactive :迅速なレスポンス
def index = Action.async {

val customer: Future[Customer] = getCustomer()

customer.map(c => Ok("Customer: " + c))

}
クライアント サーバ サービス
ノンブ
ロッキング
ノンブ
ロッキング
高レスポンス  
Responsive
伸縮性  
Elastic
耐障害性  
Resilient
メッセージ駆動  
Message-driven
Copyright © 2015 TIS Inc. All rights reserved. 22
Reactive :サーバからのプッシュ
クライアント サーバ
def socket = WebSocket.using[String] { request =>



// Log events to the console

val in = Iteratee.foreach[String](println).map { _ =>

println("Disconnected")

}



// Send a single 'Hello!' message

val out = Enumerator("Hello!")



(in, out)

}
ノンブ
ロッキング
WebSocket
高レスポンス  
Responsive
伸縮性  
Elastic
耐障害性  
Resilient
メッセージ駆動  
Message-driven
https://www.playframework.com/documentation/2.4.x/ScalaWebSockets
Copyright © 2015 TIS Inc. All rights reserved. 23
Akka
•並行処理と分散処理をサポートするActor	
  System	
  
•Supervision	
  Model	
  
•location	
  transparency
Copyright © 2015 TIS Inc. All rights reserved. 24
Actor System
sender
Actor
Mailbox
Mailbox
高レスポンス  
Responsive
伸縮性  
Elastic
耐障害性  
Resilient
メッセージ駆動  
Message-driven
Copyright © 2015 TIS Inc. All rights reserved. 25
Reactive :Actor Model
def socket = WebSocket.acceptWithActor[String, String] { request => out
=>

MyWebSocketActor.props(out)

}
object MyWebSocketActor {

def props(out: ActorRef) = Props(new MyWebSocketActor(out))

}



class MyWebSocketActor(out: ActorRef) extends Actor {

def receive = {

case msg: String =>

out ! ("I received your message: " + msg)

}

}
クライアント
コントローラ
Actor
ノンブロッ
キング
WebSocket
Actor
https://www.playframework.com/documentation/2.4.x/ScalaWebSockets
高レスポンス  
Responsive
伸縮性  
Elastic
耐障害性  
Resilient
メッセージ駆動  
Message-driven
Copyright © 2015 TIS Inc. All rights reserved. 26
Supervision Modelで障害に強いシステムに
override val supervisorStrategy: SupervisorStrategy =

AllForOneStrategy(maxNrOfRetries = 100, withinTimeRange = 1 minute) {

case _ => Restart

}
スーパー	
  
バイザー
サブスーパー	
  
バイザー
Actor
Actor Actor
-­‐OneForOne	
  
-­‐AllForOne
障害を外へ波及させない
子アクターの監視役
高レスポンス  
Responsive
伸縮性  
Elastic
耐障害性  
Resilient
メッセージ駆動  
Message-driven
Copyright © 2015 TIS Inc. All rights reserved. 27
let	
  it	
  crash
Copyright © 2015 TIS Inc. All rights reserved. 28
Distribute
https://conductr.typesafe.com/docs/1.0.x/DeployingApplication
Copyright © 2015 TIS Inc. All rights reserved. 29
Reactive :Actorを増減させ容易にスケール
クライアント
コントローラ
Actor
Actor
Actor
ルーティングは様々	
  
• ランダム	
  
• ラウンドロビン	
  
• 最小メールボックス	
  
• ブロードキャスト	
  
• 最速採用
ノンブ
ロッキング
WebSocket
Actor
location	
  	
  transparently
高レスポンス  
Responsive
伸縮性  
Elastic
耐障害性  
Resilient
メッセージ駆動  
Message-driven
Copyright © 2015 TIS Inc. All rights reserved. 30
Reactive Slick (Slick3.0)
•FRM(Functional	
  Relational	
  Mapping)ライブラリ	
  
•Scalaのコレクションを扱うかのようにDBアクセスで
きる	
  
•DB処理は非同期に実行される
Copyright © 2015 TIS Inc. All rights reserved. 31
Supported Databases
•MySQL	
  
•PostgreSQL	
  
•H2	
  
•HSQLDB/HyperSQL	
  
•SQLite	
  
•Derby/JavaDB	
  
•Microsoft	
  Access
•DB2	
  
•Microsoft	
  SQL	
  Server	
  
•Oracle
Slick Extensions
Copyright © 2015 TIS Inc. All rights reserved. 32
Reactive :端から端までReactive
def search = Action.async { implicit request =>
…

val f:Future[Seq[EventRow]] = db.run(Events.filter(form))
f.map {

case events if (events.length > 0) =>

Ok(views.html.sample.search(
form.bindFromRequest, events))

case _ =>

…
クライアント
コントローラ
ノンブ
ロッキング
WebSocket
Actor
ノンブ
ロッキング
Actor
データベース
高レスポンス  
Responsive
伸縮性  
Elastic
耐障害性  
Resilient
メッセージ駆動  
Message-driven
Copyright © 2015 TIS Inc. All rights reserved. 33
def search = Action.async { implicit request =>
…

val f:Future[Seq[EventRow]] = db.run(Events.filter(form))
f.map {

case events if (events.length > 0) =>

Ok(views.html.sample.search(
form.bindFromRequest, events))

case _ =>

… 高レスポンス  
Responsive
クライアント
コントローラ
ノンブロッ
キング
WebSocket
Actor
ノンブロッ
キング
Actor
データベース
Asynchronousが基本、	
  
どこでWaitするかをデザインする
Reactive :端から端までReactive
Copyright © 2015 TIS Inc. All rights reserved. 34
Reactive :Reactive Streams
def search = Action.async { implicit request =>
…

val q = for(e <- Event) yield e.eventNm
val publisher:DatabasePublisher[String] = db.stream(q.result)
publisher.foreach {e => println(e)}
…
クライアント
コントローラ
ノンブ
ロッキング
WebSocket
Actor
ノンブ
ロッキング
データベース
Actor
高レスポンス  
Responsive
伸縮性  
Elastic
耐障害性  
Resilient
メッセージ駆動  
Message-driven
Copyright © 2015 TIS Inc. All rights reserved. 35
3.  Reactive体験
Copyright © 2015 TIS Inc. All rights reserved. 36
自己紹介
■ 根来	
  和輝	
  (ねごろ	
  かずき)	
  
■ @negokaz	
  
■ TIS株式会社	
  
■ 生産革新本部 生産革新部 生産技術R&D室	
  
■ 次世代のアプリケーション開発手法を研究開発
Copyright © 2015 TIS Inc. All rights reserved. 37
Reactive体験
もし、あなたがソーラーファームのオーナーになったら?
発電効率をできるだけ高めたいですよね。	
  
故障したソーラーパネルがないか監視しましょう。
Copyright © 2015 TIS Inc. All rights reserved. 38
Reactive Solar Farm Monitor Solar Farm
③ アラートを表示
ID:	
  1
② 故障している!
パネルを検知
それぞれが毎秒、発電した
電力(W)のデータを送信
ID:	
  1
Reactive Solar Farm Monitor
Icon	
  made	
  by	
  Freepik	
  from	
  www.flaticon.com	
  is	
  licensed	
  under	
  CC	
  BY	
  3.0
発電状況を表示
① 故障して!
発電力が低下
Copyright © 2015 TIS Inc. All rights reserved. 39
ソーラーパネルの故障検知
全パネルの平均電力からしきい値を決め

それ以下の電力しか発電していないものを	
  
故障したとみなす
‣ 発電している電力が	
  0	
  のものを故障とみなす?	
  
‣ 夜になったらどうする?
OK NG
平均値
しきい値
Copyright © 2015 TIS Inc. All rights reserved. 40
故障検知でやるべきこと
‣全パネルの平均電力を求める	
  
‣平均値からしきい値を決める	
  
‣全パネルの電力としきい値を比較する
ただしリアルタイムで
Copyright © 2015 TIS Inc. All rights reserved. 41
Architecture
Monitor Analyzer
SolarFarmSimulator
HTTP!
&!
WebSocket
Copyright © 2015 TIS Inc. All rights reserved. 42
https://github.com/tech-­‐sketch/reactive-­‐solar-­‐farm-­‐monitor
Reactive体験1 - Responsive
Copyright © 2015 TIS Inc. All rights reserved. 43
Reactive体験1 - Responsive
高レスポンス  
Responsive
伸縮性  
Elastic
耐障害性  
Resilient
メッセージ駆動  
Message-driven
高レスポンス  
Responsive
伸縮性  
Elastic
耐障害性  
Resilient
メッセージ駆動  
Message-driven
Copyright © 2015 TIS Inc. All rights reserved. 44
高レスポンス  
Responsive
伸縮性  
Elastic
耐障害性  
Resilient
メッセージ駆動  
Message-driven
届けたい価値
手段
支える原理
Reactive体験2 - Elastic
高レスポンス  
Responsive
伸縮性  
Elastic
耐障害性  
Resilient
メッセージ駆動  
Message-driven
Copyright © 2015 TIS Inc. All rights reserved. 45
1つのActorですべての計算処理を行う場合
Application	
  Cluster
Analyzer
AnalyzerMonitor
Mater
1
3
2
4
Worker
SolarFarmSimulator
高レスポンス  
Responsive
伸縮性  
Elastic
耐障害性  
Resilient
メッセージ駆動  
Message-driven
Copyright © 2015 TIS Inc. All rights reserved. 46
Application	
  Cluster
Analyzer
Analyzer
Analyzer
Analyzer
Monitor
Master1
3
2
4
複数のActorに処理を振り分ける
Worker
SolarFarmSimulator
高レスポンス  
Responsive
伸縮性  
Elastic
耐障害性  
Resilient
メッセージ駆動  
Message-driven
Copyright © 2015 TIS Inc. All rights reserved. 47
高レスポンス  
Responsive
伸縮性  
Elastic
耐障害性  
Resilient
メッセージ駆動  
Message-driven
届けたい価値
手段
支える原理
Reactive体験3 - Resilient
Copyright © 2015 TIS Inc. All rights reserved. 48
Application	
  Cluster
Analyzer
AnalyzerMonitor
Master1
3
2
4
Workerがダウンすると
Worker
AnalyzerAnalyzer
SolarFarmSimulator
高レスポンス  
Responsive
伸縮性  
Elastic
耐障害性  
Resilient
メッセージ駆動  
Message-driven
Copyright © 2015 TIS Inc. All rights reserved.
Application	
  Cluster
Analyzer
Analyzer
Analyzer
Analyzer
Monitor
Master1 3
2
4
Worker
残りのWorkerでやりくりする
SolarFarmSimulator
高レスポンス  
Responsive
伸縮性  
Elastic
耐障害性  
Resilient
メッセージ駆動  
Message-driven
Copyright © 2015 TIS Inc. All rights reserved. 50
Application	
  Cluster
Analyzer
Analyzer
Analyzer
Analyzer
Monitor
Master1
3
2
4
Masterがダウンすると
Worker
SolarFarmSimulator
高レスポンス  
Responsive
伸縮性  
Elastic
耐障害性  
Resilient
メッセージ駆動  
Message-driven
Copyright © 2015 TIS Inc. All rights reserved. 51
Application	
  Cluster
Analyzer
Analyzer
AnalyzerMonitor
1
3
2
4
Analyzer
Master
WorkerのひとつがMasterになり残りでやりくりする
Worker
SolarFarmSimulator
高レスポンス  
Responsive
伸縮性  
Elastic
耐障害性  
Resilient
メッセージ駆動  
Message-driven
Copyright © 2015 TIS Inc. All rights reserved. 52
Application	
  Cluster
Analyzer
AnalyzerMonitor
1
3
2
4
Analyzer
Master
ダウンしたAnalyzerを起動するとWorkerとなって働く
Worker
Analyzer
SolarFarmSimulator
高レスポンス  
Responsive
伸縮性  
Elastic
耐障害性  
Resilient
メッセージ駆動  
Message-driven
Copyright © 2015 TIS Inc. All rights reserved. 53
支えているのはメッセージ駆動のアーキテクチャ
Reactive体験4 - Message Driven
高レスポンス  
Responsive
伸縮性  
Elastic
耐障害性  
Resilient
メッセージ駆動  
Message-driven
Copyright © 2015 TIS Inc. All rights reserved. 54
4.  Go  Reactive
Copyright © 2015 TIS Inc. All rights reserved. 55
Go Reactive
http://www.tis.jp/service_solution/goreactive/
リアクティブに興味のある方はご連絡下さい。
go-­‐reactive@tis.co.jp
Copyright © 2015 TIS Inc. All rights reserved. 56
Go Reactive
ソースコードはGitHubで公開しています。
太陽光発電に興味のある方はご連絡下さい。
https://github.com/tech-­‐sketch/reactive-­‐solar-­‐farm-­‐monitor
go-­‐reactive@tis.co.jp
THANK YOU

Typesafe Reactive Platformで作るReactive System入門

  • 1.
    Copyright © 2015TIS Inc. All rights reserved. Reactive  System  Meetup  in  西新宿 Typesafe  Reactive  Platformで作る Reactive  System入門 2015.8.18 前出 祐吾   根来 和輝
  • 2.
    Copyright © 2015TIS Inc. All rights reserved. 2 自己紹介 ■ @yugolf   ! ■ TIS株式会社   ■ 生産革新本部 生産革新部 生産技術R&D室   ■ 社内向けエンジニアリング基盤の整備 ▶▶︎
  • 3.
    Copyright © 2015TIS Inc. All rights reserved. 3 TIS、リアクティブコンサルはじめました http://www.tis.jp/service_solution/goreactive/
  • 4.
    Copyright © 2015TIS Inc. All rights reserved. 4 Agenda 1.  Reactive  Systemとは   2.  Reactive  Systemのための技術   3.  Reactive体験
  • 5.
    Copyright © 2015TIS Inc. All rights reserved. 5 1.    Reactive  Systemとは
  • 6.
    Copyright © 2015TIS Inc. All rights reserved. 6 本日の話 http://www.reactivemanifesto.org/ Reactive  Programming:   データの流れ(ストリーム)とデータの値の変化の伝播にフォーカス したプログラムの設計モデル。   ・・・ の話ではない。 Reactive  System:
  • 7.
    Copyright © 2015TIS Inc. All rights reserved. 7 Reactive manifesto 絵   ! 即応性   弾力性   耐障害性   メッセージ駆動 http://www.reactivemanifesto.org/ja
  • 8.
    Copyright © 2015TIS Inc. All rights reserved. 8 アプリケーションへの高まる要求 50台のサーバで動かしていたけど、クラウド上で 1000コアの環境を作りたいんだ。 レスポンスを得るのに3秒かかるけど、 500ミリ秒くらいにしたいのよ。   それと、年1回の2時間のメンテナンス なんとかならないかしら。 最初は100ギガくらいだったけど、そ ろそろペタ行くんじゃないかな。
  • 9.
    Copyright © 2015TIS Inc. All rights reserved. 9 Reactive Systemとは 即応性と、耐障害性と、弾力性と、メッセージ駆動とを備えたシステム http://www.reactivemanifesto.org/ja
  • 10.
    Copyright © 2015TIS Inc. All rights reserved. 10 Reactive Systemの価値 届けたい価値 手段 支える原理 高レスポンス   Responsive 伸縮性   Elastic 耐障害性   Resilient メッセージ駆動   Message-driven
  • 11.
    Copyright © 2015TIS Inc. All rights reserved. Reactive  Design  Pattern(http://manning.com/kuhn/) 11 Responsive ユーザーの要求に迅速にレスポンスするシステム 高レスポンス   Responsive 伸縮性   Elastic 耐障害性   Resilient メッセージ駆動   Message-driven 届けたい価値 手段 支える原理 ✓高レスポンスを維持するため、リソースプランニングを行い、コンポー ネントの分割・分散を考慮すべき
  • 12.
    Copyright © 2015TIS Inc. All rights reserved. 12 Elastic 通常の負荷時だけでなく、一時的な高負荷状況でも、変動するワークロードに応 じて割り当てるリソースを増加・減少させることで応答時間を一定水準に保つ   高レスポンス   Responsive 伸縮性   Elastic 耐障害性   Resilient メッセージ駆動   Message-driven 届けたい価値 手段 支える原理 Reactive  Design  Pattern(http://manning.com/kuhn/) ✓伸縮性のため、負荷を監視し、その変化に応じて分散する必要がある   ✓1つの部品がボトルネックを持ってはいけないし、独立して動作すべき
  • 13.
    Copyright © 2015TIS Inc. All rights reserved. 13 Resilient 部分的な障害が発生した時にもシステム全体を危険にさらすことなく回復さ せ、高レスポンスを維持する 高レスポンス   Responsive 伸縮性   Elastic 耐障害性   Resilient メッセージ駆動   Message-driven 届けたい価値 手段 支える原理 Reactive  Design  Pattern(http://manning.com/kuhn/) ✓耐障害性を高めるため、故障したコンポーネントを修復したり、代替 となるコンポーネントを再接続するメカニズムが必要
  • 14.
    Copyright © 2015TIS Inc. All rights reserved. 14 Message Driven メッセージパッシングにより、コンポーネント間を疎結合にする 高レスポンス   Responsive 伸縮性   Elastic 耐障害性   Resilient メッセージ駆動   Message-driven 届けたい価値 手段 支える原理 Reactive  Design  Pattern(http://manning.com/kuhn/) ✓すべてがメッセージ駆動により実現される
  • 15.
    Copyright © 2015TIS Inc. All rights reserved. 15 2.  Reactive  Systemのための技術
  • 16.
    Copyright © 2015TIS Inc. All rights reserved. 16 Typesafe Reactive Platform JavaVM アプリケーション  AkkaPlay  Framework Scala Java Slick 高レスポンス   Responsive 伸縮性   Elastic 耐障害性   Resilient メッセージ駆動   Message-driven
  • 17.
    Copyright © 2015TIS Inc. All rights reserved. 17 Play Framework •非同期/ノンブロッキング   •WebSocketサポート   •Railsのような使いやすさ
  • 18.
    Copyright © 2015TIS Inc. All rights reserved. 18 これまで def index = Action { implicit request =>
 Ok(views.html.index())
 } クライアント サーバ ブロッキ ング 高レスポンス   Responsive 伸縮性   Elastic 耐障害性   Resilient メッセージ駆動   Message-driven
  • 19.
    Copyright © 2015TIS Inc. All rights reserved. 19 Blocking コーヒーください。 コーヒー1つ∼ は∼い できた∼ ・・・ コーヒーどうぞ∼   100円です。 コーヒーください。 コーヒー1つ∼ Block
  • 20.
    Copyright © 2015TIS Inc. All rights reserved. 20 Non-blocking コーヒーください。 コーヒー1つ∼ は∼い コーヒーどうぞ∼   コーヒーください。 コーヒー1つ∼ 100円です。 100円です。 は∼い できた∼ コーヒーください。
  • 21.
    Copyright © 2015TIS Inc. All rights reserved. 21 Reactive :迅速なレスポンス def index = Action.async {
 val customer: Future[Customer] = getCustomer()
 customer.map(c => Ok("Customer: " + c))
 } クライアント サーバ サービス ノンブ ロッキング ノンブ ロッキング 高レスポンス   Responsive 伸縮性   Elastic 耐障害性   Resilient メッセージ駆動   Message-driven
  • 22.
    Copyright © 2015TIS Inc. All rights reserved. 22 Reactive :サーバからのプッシュ クライアント サーバ def socket = WebSocket.using[String] { request =>
 
 // Log events to the console
 val in = Iteratee.foreach[String](println).map { _ =>
 println("Disconnected")
 }
 
 // Send a single 'Hello!' message
 val out = Enumerator("Hello!")
 
 (in, out)
 } ノンブ ロッキング WebSocket 高レスポンス   Responsive 伸縮性   Elastic 耐障害性   Resilient メッセージ駆動   Message-driven https://www.playframework.com/documentation/2.4.x/ScalaWebSockets
  • 23.
    Copyright © 2015TIS Inc. All rights reserved. 23 Akka •並行処理と分散処理をサポートするActor  System   •Supervision  Model   •location  transparency
  • 24.
    Copyright © 2015TIS Inc. All rights reserved. 24 Actor System sender Actor Mailbox Mailbox 高レスポンス   Responsive 伸縮性   Elastic 耐障害性   Resilient メッセージ駆動   Message-driven
  • 25.
    Copyright © 2015TIS Inc. All rights reserved. 25 Reactive :Actor Model def socket = WebSocket.acceptWithActor[String, String] { request => out =>
 MyWebSocketActor.props(out)
 } object MyWebSocketActor {
 def props(out: ActorRef) = Props(new MyWebSocketActor(out))
 }
 
 class MyWebSocketActor(out: ActorRef) extends Actor {
 def receive = {
 case msg: String =>
 out ! ("I received your message: " + msg)
 }
 } クライアント コントローラ Actor ノンブロッ キング WebSocket Actor https://www.playframework.com/documentation/2.4.x/ScalaWebSockets 高レスポンス   Responsive 伸縮性   Elastic 耐障害性   Resilient メッセージ駆動   Message-driven
  • 26.
    Copyright © 2015TIS Inc. All rights reserved. 26 Supervision Modelで障害に強いシステムに override val supervisorStrategy: SupervisorStrategy =
 AllForOneStrategy(maxNrOfRetries = 100, withinTimeRange = 1 minute) {
 case _ => Restart
 } スーパー   バイザー サブスーパー   バイザー Actor Actor Actor -­‐OneForOne   -­‐AllForOne 障害を外へ波及させない 子アクターの監視役 高レスポンス   Responsive 伸縮性   Elastic 耐障害性   Resilient メッセージ駆動   Message-driven
  • 27.
    Copyright © 2015TIS Inc. All rights reserved. 27 let  it  crash
  • 28.
    Copyright © 2015TIS Inc. All rights reserved. 28 Distribute https://conductr.typesafe.com/docs/1.0.x/DeployingApplication
  • 29.
    Copyright © 2015TIS Inc. All rights reserved. 29 Reactive :Actorを増減させ容易にスケール クライアント コントローラ Actor Actor Actor ルーティングは様々   • ランダム   • ラウンドロビン   • 最小メールボックス   • ブロードキャスト   • 最速採用 ノンブ ロッキング WebSocket Actor location    transparently 高レスポンス   Responsive 伸縮性   Elastic 耐障害性   Resilient メッセージ駆動   Message-driven
  • 30.
    Copyright © 2015TIS Inc. All rights reserved. 30 Reactive Slick (Slick3.0) •FRM(Functional  Relational  Mapping)ライブラリ   •Scalaのコレクションを扱うかのようにDBアクセスで きる   •DB処理は非同期に実行される
  • 31.
    Copyright © 2015TIS Inc. All rights reserved. 31 Supported Databases •MySQL   •PostgreSQL   •H2   •HSQLDB/HyperSQL   •SQLite   •Derby/JavaDB   •Microsoft  Access •DB2   •Microsoft  SQL  Server   •Oracle Slick Extensions
  • 32.
    Copyright © 2015TIS Inc. All rights reserved. 32 Reactive :端から端までReactive def search = Action.async { implicit request => …
 val f:Future[Seq[EventRow]] = db.run(Events.filter(form)) f.map {
 case events if (events.length > 0) =>
 Ok(views.html.sample.search( form.bindFromRequest, events))
 case _ =>
 … クライアント コントローラ ノンブ ロッキング WebSocket Actor ノンブ ロッキング Actor データベース 高レスポンス   Responsive 伸縮性   Elastic 耐障害性   Resilient メッセージ駆動   Message-driven
  • 33.
    Copyright © 2015TIS Inc. All rights reserved. 33 def search = Action.async { implicit request => …
 val f:Future[Seq[EventRow]] = db.run(Events.filter(form)) f.map {
 case events if (events.length > 0) =>
 Ok(views.html.sample.search( form.bindFromRequest, events))
 case _ =>
 … 高レスポンス   Responsive クライアント コントローラ ノンブロッ キング WebSocket Actor ノンブロッ キング Actor データベース Asynchronousが基本、   どこでWaitするかをデザインする Reactive :端から端までReactive
  • 34.
    Copyright © 2015TIS Inc. All rights reserved. 34 Reactive :Reactive Streams def search = Action.async { implicit request => …
 val q = for(e <- Event) yield e.eventNm val publisher:DatabasePublisher[String] = db.stream(q.result) publisher.foreach {e => println(e)} … クライアント コントローラ ノンブ ロッキング WebSocket Actor ノンブ ロッキング データベース Actor 高レスポンス   Responsive 伸縮性   Elastic 耐障害性   Resilient メッセージ駆動   Message-driven
  • 35.
    Copyright © 2015TIS Inc. All rights reserved. 35 3.  Reactive体験
  • 36.
    Copyright © 2015TIS Inc. All rights reserved. 36 自己紹介 ■ 根来  和輝  (ねごろ  かずき)   ■ @negokaz   ■ TIS株式会社   ■ 生産革新本部 生産革新部 生産技術R&D室   ■ 次世代のアプリケーション開発手法を研究開発
  • 37.
    Copyright © 2015TIS Inc. All rights reserved. 37 Reactive体験 もし、あなたがソーラーファームのオーナーになったら? 発電効率をできるだけ高めたいですよね。   故障したソーラーパネルがないか監視しましょう。
  • 38.
    Copyright © 2015TIS Inc. All rights reserved. 38 Reactive Solar Farm Monitor Solar Farm ③ アラートを表示 ID:  1 ② 故障している! パネルを検知 それぞれが毎秒、発電した 電力(W)のデータを送信 ID:  1 Reactive Solar Farm Monitor Icon  made  by  Freepik  from  www.flaticon.com  is  licensed  under  CC  BY  3.0 発電状況を表示 ① 故障して! 発電力が低下
  • 39.
    Copyright © 2015TIS Inc. All rights reserved. 39 ソーラーパネルの故障検知 全パネルの平均電力からしきい値を決め
 それ以下の電力しか発電していないものを   故障したとみなす ‣ 発電している電力が  0  のものを故障とみなす?   ‣ 夜になったらどうする? OK NG 平均値 しきい値
  • 40.
    Copyright © 2015TIS Inc. All rights reserved. 40 故障検知でやるべきこと ‣全パネルの平均電力を求める   ‣平均値からしきい値を決める   ‣全パネルの電力としきい値を比較する ただしリアルタイムで
  • 41.
    Copyright © 2015TIS Inc. All rights reserved. 41 Architecture Monitor Analyzer SolarFarmSimulator HTTP! &! WebSocket
  • 42.
    Copyright © 2015TIS Inc. All rights reserved. 42 https://github.com/tech-­‐sketch/reactive-­‐solar-­‐farm-­‐monitor Reactive体験1 - Responsive
  • 43.
    Copyright © 2015TIS Inc. All rights reserved. 43 Reactive体験1 - Responsive 高レスポンス   Responsive 伸縮性   Elastic 耐障害性   Resilient メッセージ駆動   Message-driven 高レスポンス   Responsive 伸縮性   Elastic 耐障害性   Resilient メッセージ駆動   Message-driven
  • 44.
    Copyright © 2015TIS Inc. All rights reserved. 44 高レスポンス   Responsive 伸縮性   Elastic 耐障害性   Resilient メッセージ駆動   Message-driven 届けたい価値 手段 支える原理 Reactive体験2 - Elastic 高レスポンス   Responsive 伸縮性   Elastic 耐障害性   Resilient メッセージ駆動   Message-driven
  • 45.
    Copyright © 2015TIS Inc. All rights reserved. 45 1つのActorですべての計算処理を行う場合 Application  Cluster Analyzer AnalyzerMonitor Mater 1 3 2 4 Worker SolarFarmSimulator 高レスポンス   Responsive 伸縮性   Elastic 耐障害性   Resilient メッセージ駆動   Message-driven
  • 46.
    Copyright © 2015TIS Inc. All rights reserved. 46 Application  Cluster Analyzer Analyzer Analyzer Analyzer Monitor Master1 3 2 4 複数のActorに処理を振り分ける Worker SolarFarmSimulator 高レスポンス   Responsive 伸縮性   Elastic 耐障害性   Resilient メッセージ駆動   Message-driven
  • 47.
    Copyright © 2015TIS Inc. All rights reserved. 47 高レスポンス   Responsive 伸縮性   Elastic 耐障害性   Resilient メッセージ駆動   Message-driven 届けたい価値 手段 支える原理 Reactive体験3 - Resilient
  • 48.
    Copyright © 2015TIS Inc. All rights reserved. 48 Application  Cluster Analyzer AnalyzerMonitor Master1 3 2 4 Workerがダウンすると Worker AnalyzerAnalyzer SolarFarmSimulator 高レスポンス   Responsive 伸縮性   Elastic 耐障害性   Resilient メッセージ駆動   Message-driven
  • 49.
    Copyright © 2015TIS Inc. All rights reserved. Application  Cluster Analyzer Analyzer Analyzer Analyzer Monitor Master1 3 2 4 Worker 残りのWorkerでやりくりする SolarFarmSimulator 高レスポンス   Responsive 伸縮性   Elastic 耐障害性   Resilient メッセージ駆動   Message-driven
  • 50.
    Copyright © 2015TIS Inc. All rights reserved. 50 Application  Cluster Analyzer Analyzer Analyzer Analyzer Monitor Master1 3 2 4 Masterがダウンすると Worker SolarFarmSimulator 高レスポンス   Responsive 伸縮性   Elastic 耐障害性   Resilient メッセージ駆動   Message-driven
  • 51.
    Copyright © 2015TIS Inc. All rights reserved. 51 Application  Cluster Analyzer Analyzer AnalyzerMonitor 1 3 2 4 Analyzer Master WorkerのひとつがMasterになり残りでやりくりする Worker SolarFarmSimulator 高レスポンス   Responsive 伸縮性   Elastic 耐障害性   Resilient メッセージ駆動   Message-driven
  • 52.
    Copyright © 2015TIS Inc. All rights reserved. 52 Application  Cluster Analyzer AnalyzerMonitor 1 3 2 4 Analyzer Master ダウンしたAnalyzerを起動するとWorkerとなって働く Worker Analyzer SolarFarmSimulator 高レスポンス   Responsive 伸縮性   Elastic 耐障害性   Resilient メッセージ駆動   Message-driven
  • 53.
    Copyright © 2015TIS Inc. All rights reserved. 53 支えているのはメッセージ駆動のアーキテクチャ Reactive体験4 - Message Driven 高レスポンス   Responsive 伸縮性   Elastic 耐障害性   Resilient メッセージ駆動   Message-driven
  • 54.
    Copyright © 2015TIS Inc. All rights reserved. 54 4.  Go  Reactive
  • 55.
    Copyright © 2015TIS Inc. All rights reserved. 55 Go Reactive http://www.tis.jp/service_solution/goreactive/ リアクティブに興味のある方はご連絡下さい。 go-­‐reactive@tis.co.jp
  • 56.
    Copyright © 2015TIS Inc. All rights reserved. 56 Go Reactive ソースコードはGitHubで公開しています。 太陽光発電に興味のある方はご連絡下さい。 https://github.com/tech-­‐sketch/reactive-­‐solar-­‐farm-­‐monitor go-­‐reactive@tis.co.jp
  • 57.