29
バッチではじめてAkka使ってみた Koji Agawa @atty303

バッチではじめてAkkaを使ってみた (refined)

Embed Size (px)

Citation preview

Page 1: バッチではじめてAkkaを使ってみた (refined)

バッチではじめてAkkaを 使ってみた

Koji Agawa @atty303

Page 2: バッチではじめてAkkaを使ってみた (refined)

どんなバッチ?

Page 3: バッチではじめてAkkaを使ってみた (refined)

Declarative Reporting Platform

Page 4: バッチではじめてAkkaを使ってみた (refined)

おおざっぱに言うと……• レポートデータの生成特化のビルドツール

• S3 上のログや Redshift のコントロール

• ログや中間テーブルの依存関係(DAG)とビルド方法を宣言的に記述

Page 5: バッチではじめてAkkaを使ってみた (refined)

Lake (Actor)

Page 6: バッチではじめてAkkaを使ってみた (refined)

Design

• Lake (データ溜まりの抽象) が Actor

• 依存する Lake のビルド完了を待ち自身のビルドを開始する

• Actor は FSM で実装

Page 7: バッチではじめてAkkaを使ってみた (refined)

そんなバッチでAkkaを使ったときのポイント3つ

Page 8: バッチではじめてAkkaを使ってみた (refined)

Actor and Future

Page 9: バッチではじめてAkkaを使ってみた (refined)
Page 10: バッチではじめてAkkaを使ってみた (refined)

"全てのものはアクターである"

???

Page 11: バッチではじめてAkkaを使ってみた (refined)

https://www.chrisstucchio.com/blog/2013/actors_vs_futures.html

"Don't use Actors for concurrency"

Page 12: バッチではじめてAkkaを使ってみた (refined)

ActorとFutureの使い分け

Actor Future

Stateful Stateless

Page 13: バッチではじめてAkkaを使ってみた (refined)

分かりやすい! \(^o^)/

Page 14: バッチではじめてAkkaを使ってみた (refined)

Logging

Page 15: バッチではじめてAkkaを使ってみた (refined)

ロギング• ログにコンテキスト情報を付与したい

• ログのためだけにコード内でコンテキスト情報を持ち回りたくない(本質が隠れる)

Page 16: バッチではじめてAkkaを使ってみた (refined)

そんな目的にぴったりなのが

Page 17: バッチではじめてAkkaを使ってみた (refined)

SLF4J MDC - Mapped Diagnostic Context

Page 18: バッチではじめてAkkaを使ってみた (refined)

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)

Thread Local !?

ForkJoinPool や ThreadPoolExecutor を使う

akka と相性が悪い……

Page 20: バッチではじめてAkkaを使ってみた (refined)

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)

MDCPropagatingDispatcher

• カスタム Akka Dispatcher として実装するので設定変更のみでOK

• カスタムの ExecutionContext が MDC の情報を呼び出し元スレッドから呼び出し先スレッドへ伝搬させる

Page 22: バッチではじめてAkkaを使ってみた (refined)

便利! \(^o^)/

Page 23: バッチではじめてAkkaを使ってみた (refined)

Crash strategy

Page 24: バッチではじめてAkkaを使ってみた (refined)

標準の ActorKernel

PlanRunner

LakeRunner

Supervise

Supervise

Kernel

PlanRunner

LakeRunner

Crash!

Kernel

PlanRunner

LakeRunner

Restart

Page 25: バッチではじめてAkkaを使ってみた (refined)

Crash strategy

• 標準の Actor はクラッシュフリー

• バッチなので例外発生時は止まってほしい

Page 26: バッチではじめてAkkaを使ってみた (refined)

SupervisorStrategy

val escalationStrategy: SupervisorStrategy = { def decider: Decider = { case _: Exception => Escalate } OneForOneStrategy()(decider)}

override val supervisorStrategy = escalationStrategy

Page 27: バッチではじめてAkkaを使ってみた (refined)

Escalation StrategyKernel

PlanRunner

LakeRunner

Kernel

PlanRunner

LakeRunner

Crash!

Kernel

PlanRunner

LakeRunner

Escalate

Escalate

Terminate

Page 28: バッチではじめてAkkaを使ってみた (refined)

Crash! \(^o^)/

Page 29: バッチではじめてAkkaを使ってみた (refined)

参考

http://letitcrash.com/