typesafe reactive platformで作るreactive system
TRANSCRIPT
Copyright © 2015 TIS Inc. All rights reserved.
Scala関西Summit2015
Typesafe Reactive Platformで作るReactive System2015.8.1
前出 祐吾
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. 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. 11
Responsive
ユーザーの要求に迅速にレスポンスするシステム
高レスポンス Responsive
伸縮性 Elastic
耐障害性 Resilient
メッセージ駆動 Message-driven
届けたい価値
手段
支える原理
Copyright © 2015 TIS Inc. All rights reserved. 12
Elastic
通常の負荷時だけでなく、一時的な高負荷状況でも、変動するワークロードに応じて割り当てるリソースを増加・減少させることで応答時間を一定水準に保つ
高レスポンス Responsive
伸縮性 Elastic
耐障害性 Resilient
メッセージ駆動 Message-driven
届けたい価値
手段
支える原理
Copyright © 2015 TIS Inc. All rights reserved. 13
Resilient
部分的な障害が発生した時にもシステム全体を危険にさらすことなく回復させる高レスポンスを維持する
高レスポンス Responsive
伸縮性 Elastic
耐障害性 Resilient
メッセージ駆動 Message-driven
届けたい価値
手段
支える原理
Copyright © 2015 TIS Inc. All rights reserved. 14
Message Driven
メッセージパッシングにより、コンポーネント間を疎結合にする
高レスポンス Responsive
伸縮性 Elastic
耐障害性 Resilient
メッセージ駆動 Message-driven
届けたい価値
手段
支える原理
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
ブロッキング
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
ノンブロッキング
ノンブロッキング
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)} 高レスポンス
Responsive
ノンブロッキング
WebSocket
https://www.playframework.com/documentation/2.4.x/ScalaWebSockets
Copyright © 2015 TIS Inc. All rights reserved. 23
Akka
•並行処理と分散処理をサポートするActor System
• Supervision Model •位置透過性
Copyright © 2015 TIS Inc. All rights reserved. 24
Actor System
sender
Actor
メッセージ駆動 Message-driven
Mailbox
Mailbox
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
伸縮性 Elastic
耐障害性 Resilient
ノンブロッキング
WebSocket
Actor
https://www.playframework.com/documentation/2.4.x/ScalaWebSockets
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
障害を外へ波及させない
耐障害性 Resilient
子アクターの監視役
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ルーティングは様々
•ランダム •ラウンドロビン •ブロードキャスト •早いの採用
伸縮性 Elastic
ノンブロッキング
WebSocket
Actor
Copyright © 2015 TIS Inc. All rights reserved. 30
Reactive Slick
Slick3
• FRM(Functional Relational Mapping)ライブラリ • Scalaのコレクションを扱うかのようにデータベースにアクセス出来る • 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 _ => … 高レスポンス
Responsive
クライアントコントローラノンブロッ
キング
WebSocket
Actor
ノンブロッキング
Actor
データベース
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)} …
高レスポンス Responsive
クライアントコントローラノンブロッ
キング
WebSocket
Actor
ノンブロッキング
データベース
Actor
Copyright © 2015 TIS Inc. All rights reserved. 37Reactive Solar Farm Monitor Solar Farm
① 何らかの原因で!発電力が下がる
③ 故障が検知された!ソーラパネルの!アラートを表示
ID: 45412
② 全ソーラーパネルの!電力(W)から故障!
しているパネルを検知
ソーラーパネルがそれぞれ定期的に!発電した電力(W)のデータを送信!・毎秒送信!・パネル数は1万~10万枚を想定
ID: 45412
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. 38
Architecture
Monitor Analyzer
Simulator
http!&!
WebSocket
Subscriber
Publisher
Broker
Copyright © 2015 TIS Inc. All rights reserved. 39
Message Passing
Sum CalculatorSum
Calculator InspectorInspector
Packet
Mean Alert Snapshot
Packet
Inspection Channel
Buffer Channel
Socket
Buffer
Broker
Execute
TakeSnapshot
Collect Ghosts
Partial Sum
Inspection Manager
Sum Calculator
Execute
Inspector
DoneSample Sample
AnalyzerProxyMean
Calculator
Execute
Measurement
Measurement
SocketSocket
Copyright © 2015 TIS Inc. All rights reserved. 40
Supervision Model
AllForOneStrategy
OneForOne Strategy
Analysis Supervisor
Calculation Supervisor
Inspection Manager
Inspector
Inspection Channel
BufferBuffer Channel
Sum Calculator
Mean Calculator
Inspection Supervisor
AllForOneStrategy
User
Copyright © 2015 TIS Inc. All rights reserved. 41
プチReactive体験 - Responsive
ユーザーの要求に可能な限り迅速にレスポンスするシステム
高レスポンス Responsive
伸縮性 Elastic
耐障害性 Resilient
メッセージ駆動 Message-driven
Copyright © 2015 TIS Inc. All rights reserved. 44
Go Reactive 1/3
•アーキクチャの詳細 •時間の都合で出来なかったデモ
http://reactive-‐shinjuku.connpass.com/event/17991/
Copyright © 2015 TIS Inc. All rights reserved. 45
Go Reactive 2/3
http://www.tis.jp/service_solution/goreactive/
go-‐[email protected]リアクティブに興味のある方はご連絡下さい。
Copyright © 2015 TIS Inc. All rights reserved. 46
Go Reactive 3/3
ソースコードはGitHubで公開しています。
太陽光発電に興味のある方はご連絡下さい。
https://github.com/tech-‐sketch/reactive-‐solar-‐farm-‐monitor
go-‐[email protected]