Reactive Programing
Yasuki Okumura
自己紹介
● シャノン所属
● Play + Scala歴: 1.5 年
● PHP, Javascript, C++, python, ruby, Octave
● Web full stack engineer
● 趣味: ジム, MOOC受講
Reactive とは?
http://www.reactivemanifesto.org/
背景
*クラウド = Scale out/in up/down
*Scale Up = CPUコア数UP
*ユーザ = 人間 + 物(Intenet of Things)
Play
Reactive Programing
1. Non-blocking
2. Future
3. Akka
4. DB
Non-blocking
Blocking: 無駄にThreadを占有してしまうこと
Non-blocking: Non-blocking IO を使っている
● Nginx
● WS
● Reactive mongo
Future[A] - Await
● 基本的には使わない。
● 例外
○ テストコード
○ アプリケーション起動時 or 終了時
Future[A] - map
def map[B](f: A => B): Future[B]
val json: Future[Option[JsValue]] =
WS.url(“http://example.com/index”).get.map {
res => if(200 == res.status) {
Some(res.json)
} else {
None
}
}
Future[A] - flatMap
def flatMap[B](f: A => Future[B]): Future[B]
val json: Future[Option[JsValue]] =
WS.url(url1).get.flatMap { res =>
val id = (res.json ¥ “id” ).as[String]
WS.url(url2 + id).get.map{ res =>
if(200 == res.status){
Some(res.json)
} else {
None
}
}
}
Future[A] - Future.successful
def successful(result:B): Future[B]
val json: Future[Option[JsValue]] =
WS.url(url1).get.flatMap { res =>
if( 200 == res.status ){
val id = (res.json ¥ “id” ).as[String]
WS.url(url2 + id).get.map{ res =>
if(200 == res.status){
Some(res.json)
} else {
None
}
}
} else {
Future.successful(None)
}
}
データの操作は?
● synchronized ?
 → Deadlock or Livelock, Blocking
class Counter {
private var count = 0
def increment = this.synchronized {
count = count + 1
}
def getCount = count
}
Akka
● 分散処理フレームワーク
● Actor model
Actor
class Counter extends Actor {
var count = 0
def receive = {
case “incr” => count += 1
case “get” => sender ! count
}
}
DBは?
Database Challenge
● 速さ
● 量
● 複雑なデータ
● マルチコアでのConcurrency control
Modern database - VoltDB
● disk -> In-memory
● Multi thread -> single thread
● Dynamic lock -> Timestamp order
● Data log -> Command log
● SQL -> Stored procedure
● Auto partitioning
まとめ
● 時代が代わり求められている物も変わって来て
いる
-> 新しいアーキテクチャが必要
参考
https://class.coursera.org/reactive-001
http://voltdb.com/stonebraker-says

Reactive programming