Upload
koji-agawa
View
1.296
Download
1
Embed Size (px)
Citation preview
バッチではじめてAkkaを 使ってみた
Koji Agawa @atty303
どんなバッチ?
Declarative Reporting Platform
おおざっぱに言うと……• レポートデータの生成特化のビルドツール
• S3 上のログや Redshift のコントロール
• ログや中間テーブルの依存関係(DAG)とビルド方法を宣言的に記述
Lake (Actor)
Design
• Lake (データ溜まりの抽象) が Actor
• 依存する Lake のビルド完了を待ち自身のビルドを開始する
• Actor は FSM で実装
そんなバッチでAkkaを使ったときのポイント3つ
Actor and Future
"全てのものはアクターである"
???
https://www.chrisstucchio.com/blog/2013/actors_vs_futures.html
"Don't use Actors for concurrency"
ActorとFutureの使い分け
Actor Future
Stateful Stateless
分かりやすい! \(^o^)/
Logging
ロギング• ログにコンテキスト情報を付与したい
• ログのためだけにコード内でコンテキスト情報を持ち回りたくない(本質が隠れる)
そんな目的にぴったりなのが
SLF4J MDC - Mapped Diagnostic Context
Thread Local Storage にコンテキスト情報を保存して参照MDC.put("lake", lake.name)runPump(lake, pumpContext, trashCan) andThen { case _ => MDC.remove("lake") }
<pattern> %date{yyyy-MM-dd HH:mm:ss.SSS} [%20.20thread] [%40.40logger{40}] [%5level] [lake:%mdc{lake}] %message%n </pattern>
Thread Local !?
ForkJoinPool や ThreadPoolExecutor を使う
akka と相性が悪い……
http://yanns.github.io/blog/2014/05/04/slf4j-mapped-diagnostic-context-mdc-with-
play-framework/
"SLF4J Mapped Diagnostic Context (MDC) With Play Framework"
MDCPropagatingDispatcher
• カスタム Akka Dispatcher として実装するので設定変更のみでOK
• カスタムの ExecutionContext が MDC の情報を呼び出し元スレッドから呼び出し先スレッドへ伝搬させる
便利! \(^o^)/
Crash strategy
標準の ActorKernel
PlanRunner
LakeRunner
Supervise
Supervise
Kernel
PlanRunner
LakeRunner
Crash!
Kernel
PlanRunner
LakeRunner
Restart
Crash strategy
• 標準の Actor はクラッシュフリー
• バッチなので例外発生時は止まってほしい
SupervisorStrategy
val escalationStrategy: SupervisorStrategy = { def decider: Decider = { case _: Exception => Escalate } OneForOneStrategy()(decider)}
override val supervisorStrategy = escalationStrategy
Escalation StrategyKernel
PlanRunner
LakeRunner
Kernel
PlanRunner
LakeRunner
Crash!
Kernel
PlanRunner
LakeRunner
Escalate
Escalate
Terminate
Crash! \(^o^)/