バッチではじめてakkaを使ってみた (refined)
TRANSCRIPT
![Page 1: バッチではじめてAkkaを使ってみた (refined)](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55a68d201a28abbe7d8b46d3/html5/thumbnails/1.jpg)
バッチではじめてAkkaを 使ってみた
Koji Agawa @atty303
![Page 2: バッチではじめてAkkaを使ってみた (refined)](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55a68d201a28abbe7d8b46d3/html5/thumbnails/2.jpg)
どんなバッチ?
![Page 3: バッチではじめてAkkaを使ってみた (refined)](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55a68d201a28abbe7d8b46d3/html5/thumbnails/3.jpg)
Declarative Reporting Platform
![Page 4: バッチではじめてAkkaを使ってみた (refined)](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55a68d201a28abbe7d8b46d3/html5/thumbnails/4.jpg)
おおざっぱに言うと……• レポートデータの生成特化のビルドツール
• S3 上のログや Redshift のコントロール
• ログや中間テーブルの依存関係(DAG)とビルド方法を宣言的に記述
![Page 5: バッチではじめてAkkaを使ってみた (refined)](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55a68d201a28abbe7d8b46d3/html5/thumbnails/5.jpg)
Lake (Actor)
![Page 6: バッチではじめてAkkaを使ってみた (refined)](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55a68d201a28abbe7d8b46d3/html5/thumbnails/6.jpg)
Design
• Lake (データ溜まりの抽象) が Actor
• 依存する Lake のビルド完了を待ち自身のビルドを開始する
• Actor は FSM で実装
![Page 7: バッチではじめてAkkaを使ってみた (refined)](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55a68d201a28abbe7d8b46d3/html5/thumbnails/7.jpg)
そんなバッチでAkkaを使ったときのポイント3つ
![Page 8: バッチではじめてAkkaを使ってみた (refined)](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55a68d201a28abbe7d8b46d3/html5/thumbnails/8.jpg)
Actor and Future
![Page 9: バッチではじめてAkkaを使ってみた (refined)](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55a68d201a28abbe7d8b46d3/html5/thumbnails/9.jpg)
![Page 10: バッチではじめてAkkaを使ってみた (refined)](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55a68d201a28abbe7d8b46d3/html5/thumbnails/10.jpg)
"全てのものはアクターである"
???
![Page 11: バッチではじめてAkkaを使ってみた (refined)](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55a68d201a28abbe7d8b46d3/html5/thumbnails/11.jpg)
https://www.chrisstucchio.com/blog/2013/actors_vs_futures.html
"Don't use Actors for concurrency"
![Page 12: バッチではじめてAkkaを使ってみた (refined)](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55a68d201a28abbe7d8b46d3/html5/thumbnails/12.jpg)
ActorとFutureの使い分け
Actor Future
Stateful Stateless
![Page 13: バッチではじめてAkkaを使ってみた (refined)](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55a68d201a28abbe7d8b46d3/html5/thumbnails/13.jpg)
分かりやすい! \(^o^)/
![Page 14: バッチではじめてAkkaを使ってみた (refined)](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55a68d201a28abbe7d8b46d3/html5/thumbnails/14.jpg)
Logging
![Page 15: バッチではじめてAkkaを使ってみた (refined)](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55a68d201a28abbe7d8b46d3/html5/thumbnails/15.jpg)
ロギング• ログにコンテキスト情報を付与したい
• ログのためだけにコード内でコンテキスト情報を持ち回りたくない(本質が隠れる)
![Page 16: バッチではじめてAkkaを使ってみた (refined)](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55a68d201a28abbe7d8b46d3/html5/thumbnails/16.jpg)
そんな目的にぴったりなのが
![Page 17: バッチではじめてAkkaを使ってみた (refined)](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55a68d201a28abbe7d8b46d3/html5/thumbnails/17.jpg)
SLF4J MDC - Mapped Diagnostic Context
![Page 18: バッチではじめてAkkaを使ってみた (refined)](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55a68d201a28abbe7d8b46d3/html5/thumbnails/18.jpg)
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>
![Page 19: バッチではじめてAkkaを使ってみた (refined)](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55a68d201a28abbe7d8b46d3/html5/thumbnails/19.jpg)
Thread Local !?
ForkJoinPool や ThreadPoolExecutor を使う
akka と相性が悪い……
![Page 20: バッチではじめてAkkaを使ってみた (refined)](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55a68d201a28abbe7d8b46d3/html5/thumbnails/20.jpg)
http://yanns.github.io/blog/2014/05/04/slf4j-mapped-diagnostic-context-mdc-with-
play-framework/
"SLF4J Mapped Diagnostic Context (MDC) With Play Framework"
![Page 21: バッチではじめてAkkaを使ってみた (refined)](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55a68d201a28abbe7d8b46d3/html5/thumbnails/21.jpg)
MDCPropagatingDispatcher
• カスタム Akka Dispatcher として実装するので設定変更のみでOK
• カスタムの ExecutionContext が MDC の情報を呼び出し元スレッドから呼び出し先スレッドへ伝搬させる
![Page 22: バッチではじめてAkkaを使ってみた (refined)](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55a68d201a28abbe7d8b46d3/html5/thumbnails/22.jpg)
便利! \(^o^)/
![Page 23: バッチではじめてAkkaを使ってみた (refined)](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55a68d201a28abbe7d8b46d3/html5/thumbnails/23.jpg)
Crash strategy
![Page 24: バッチではじめてAkkaを使ってみた (refined)](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55a68d201a28abbe7d8b46d3/html5/thumbnails/24.jpg)
標準の ActorKernel
PlanRunner
LakeRunner
Supervise
Supervise
Kernel
PlanRunner
LakeRunner
Crash!
Kernel
PlanRunner
LakeRunner
Restart
![Page 25: バッチではじめてAkkaを使ってみた (refined)](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55a68d201a28abbe7d8b46d3/html5/thumbnails/25.jpg)
Crash strategy
• 標準の Actor はクラッシュフリー
• バッチなので例外発生時は止まってほしい
![Page 26: バッチではじめてAkkaを使ってみた (refined)](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55a68d201a28abbe7d8b46d3/html5/thumbnails/26.jpg)
SupervisorStrategy
val escalationStrategy: SupervisorStrategy = { def decider: Decider = { case _: Exception => Escalate } OneForOneStrategy()(decider)}
override val supervisorStrategy = escalationStrategy
![Page 27: バッチではじめてAkkaを使ってみた (refined)](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55a68d201a28abbe7d8b46d3/html5/thumbnails/27.jpg)
Escalation StrategyKernel
PlanRunner
LakeRunner
Kernel
PlanRunner
LakeRunner
Crash!
Kernel
PlanRunner
LakeRunner
Escalate
Escalate
Terminate
![Page 28: バッチではじめてAkkaを使ってみた (refined)](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55a68d201a28abbe7d8b46d3/html5/thumbnails/28.jpg)
Crash! \(^o^)/