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

  • View
    1.296

  • Download
    1

  • Category

    Software

Preview:

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^)/

参考

http://letitcrash.com/