Weitere ähnliche Inhalte
Ähnlich wie Real world android akka (20)
Real world android akka
- 2. Who am I?
麻植泰輔 / Taisuke Oe
Twitter: @OE_uia
GitHub: taisukeoe
会社
- BONX INC. でAndroidアプリ書いたりスノー
ボードするお仕事
- ScalaMatsuri座長 / Japan Scala
Association, Inc.常務理事
個人
- Scalaを教える仕事しています
- 6. 本日のお話
◉ Akka
○ メッセージ駆動
○ Actorの実行モデル
○ Actorのヒエラルキー
◉ BONX
○ BONXとは?
○ BONX VoIPクライアントの要求仕様
◉ Android Akkaの注意点
○ Dispatcher, Mailboxの実装など
◉ Scala Androidってどうなの?
- 24. Akkaについて - まとめ
◉ Actorがメッセージを送り合うことでシステムを構成
◉ 1つのActorは同時に1メッセージを1スレッドで逐次処
理するため、状態管理が楽
◉ 実行モデル
○ Dispatcher … Thread(pool)の保持と、ActorへのThread貸
出
○ Mailbox … Actorに送られたメッセージ置き場
◉ ActorのヒエラルキーとSupervisorStrategyの実装を
適切に設定することで、障害からの回復力をもつ
- 41. カスタム
ExecutorServiceConfigurator
class MyExecutorConfigurator(config: Config, prerequisites: DispatcherPrerequisites) extends
ExecutorServiceConfigurator(config, prerequisites) {
final def createExecutorServiceFactory(id: String, threadFactory: ThreadFactory): ExecutorServiceFactory = {
val c = config.getConfig("fork-join-executor")
new ForkJoinExecutorServiceFactory(
threadFactory.asInstanceOf[ForkJoinPool.ForkJoinWorkerThreadFactory],
CPUConfig.scaledPoolSize(
c.getInt("parallelism-min"),
c.getDouble("parallelism-factor"),
c.getInt("parallelism-max")),
true)
}
}
- 42. OnlineのCPUコア数を取得
object CPUConfig {
private lazy val rangeRegex = "([0-9]+)-([0-9]+)".r
def onlineProcessors: Option[Int] = Try {
val reader = new BufferedReader(new FileReader("/sys/devices/system/cpu/online"))
val num = Iterator.continually(reader.readLine()).takeWhile(_ != null).toSeq.headOption map { cpu:String =>
cpu.split(",").map {
case rangeRegex(from, to) => to.toInt - from.toInt + 1
case num => 1
}.sum
reader.close()
num
}}.toOption.flatten
def scaledPoolSize(floor: Int, multiplier: Double, ceiling: Int): Int =
math.min(math.max(onlineProcessors.getOrElse(Runtime.getRuntime.availableProcessors) * multiplier).ceil.toInt,
floor), ceiling)
}
- 43. Mailboxのサイズ
◉ Androidは(増えてきたとはいえ)基本的には低メモリ環境
◉ 1 VM ~ 数百MB RAM
◉ サイズ制限のないMessageBoxだとOutOfMemoryErrorのおそれ
◉ できるだけ有限サイズのMailbox (BoundedMailbox) を使う方が
良い
◉ それで必要要件をみたさないときは、カスタムMailboxを作るべき
参考: Mailboxes -- Akka
my-mailbox {
mailbox-type = "com.taisukeoe.MyMailBox"
}