Slide 1

Slide 1 text

Classic Actorから
 Typed Actor への移行について
 2021/03/05
 第6回Reactive System Meetup in 西新宿 LT枠
 株式会社スタンバイ
 池田健虎 @taket0ra1


Slide 2

Slide 2 text

自己紹介
 ● 株式会社スタンバイ
 ● 池田健虎
 ● 2020年12月に娘が生まれて2児の父
 ● Akkaは2020年の冬からさわりはじめました。
 ● 最近業務でやったこと
 ○ EMR on Apache Flink(Scala) ストリーム処理
 ■ 内部ではAkkaが使われています
 ○ スタンバイの広告周りのBatch処理(Actor)
 


Slide 3

Slide 3 text

Akkaへの関心が高まっている


Slide 4

Slide 4 text

Akka 2.6.13(ドキュメント)にコミッ トできました🎉


Slide 5

Slide 5 text


 Actor(Typed)を構築するDSLがClassic Actorと差異が多く、
 私自身理解をすることに時間がかかった。
 
 そこで違いを説明して
 移行する方の参考になればと思いのLTです。
 
 ● シンプルなAkka Actor Typedのカウンターサンプルコード(Scalatestサンプルあ り)
 ● Akka Typed 移行入門 (Scala)
 上記のブログ参考になりました。


Slide 6

Slide 6 text

● Learning Akka Typed from Classic 公式のドキュメントにも
 ClassicAkkaで開発している方向けに、
 Akka Typed を学ぶ資料があります。


Slide 7

Slide 7 text

ManuelさんのTour of Akka typed記事は公式ドキュメントからも推薦されてあり、
 今回の発表の参考にしています。


Slide 8

Slide 8 text

こちらの話はしません
 
 ● akka-cluster-typed
 ● akka-cluster-sharding-typed
 ● akka-persistence-typed
 ● akka-stream-typed
 ● akka-actor-testkit-typed


Slide 9

Slide 9 text

なぜClassic Actorではなく
 Typed Actorを採用するのか?


Slide 10

Slide 10 text

なぜClassic ActorではなくTyped Actorを採用するのか?
 
 ● 2019年11月にリリースされたAkka 2.6.0から
 typed Actorが安定版へ
 ● Typed APIがAkkaのメインのAPIになった。
 ○ Akka 2.6.0 Released
 ● メッセージの受け渡しが型安全になった
 ● 状態をもつようなActorをImmutableなコードで
 実装することできる


Slide 11

Slide 11 text

HelloWorld Greet Greeted 1 2

Slide 12

Slide 12 text

Actorはどんなメッセージも
 受信できる
 
 
 
 
 Actor間のメッセージの送信で
 どんなメッセージも送信できる。
 Classic Actor

Slide 13

Slide 13 text

sender()がなく、Greetメッセージを受け取ったアクターは、送信元のActorRef[Greeted]へ、Greetedと、自 身のActorRef返している。
 プロトコルメッセージでActorRef[T]を渡すことで、 
 何を期待しているのかがより明示的になる。 
 Typed Actor
 
 明示的に送信者を表すActorRefを
 メッセージに含める
 Actorを継承する代わりに、 Behaviorを定義して Actorを構築する

Slide 14

Slide 14 text

プロトコルメッセージ

Slide 15

Slide 15 text

プロトコルメッセージ
 TypedActorから公式ドキュメントでは単にメッセージではなくプロトコルと呼ばれている。 
 特定の順序と組み合わせで2つ以上のアクター間で交換されるメッセージのセットを 
 意図している。
 プロトコルメッセージ

Slide 16

Slide 16 text

プロトコルメッセージ
 プロトコル呼び出し方法もフルパスで明確にしている。 
 (公式ドキュメントでも2.6.Xからフルパスで定義されている) 
 左はAkka2.5.Xのドキュメントで、右がAkka2.6.Xのドキュメント 


Slide 17

Slide 17 text

Akka Typed の場合必ずプロトコルを宣言する必要があり、
 manuelさんの記事では、これをプロトコルファーストと呼んでいる


Slide 18

Slide 18 text

Classic Actor でも同様にプロトコルを定義できるが強制されていなかった。 
 
 そのためプロトコルを使っていない大規模なアクターシステムの拡張と維持が困難になる。 
 
 また仮にプロトコルを定義したとしても 
 
 ● コンパイル時にメッセージの型チェックができないため、処理できないアクターにメッセージ を渡していた場合に特定が難しい。 
 ● さらに時間の経過に伴うプロトコルの進化を支援するサポートメカニズムがない 
 
 
 


Slide 19

Slide 19 text

This is where the Akka Typed API comes in. This API is designed to be “protocol-first”: you no longer have a choice but to spend at least a little bit of time thinking about the messages each actor can deal with. Unlike the classic API where following this best practice is optional, you need to formalize the set of handled messages during implementation. そこで Akka Typed API の出番です。この API は "プロトコルファースト" で設計されています。この ベストプラクティスに従うことがオプションである古典的な API とは異なり、実装時に処理されるメッ セージのセットを形式化する必要があります。 Tour of Akka Typed: Protocols and Behaviors より引用

Slide 20

Slide 20 text

typed Actorのオブジェクト指向スタイル アクターの構築に Actor の代わりに AbstractBehavior[T] が継承して構築する sealed traitでプロトコルを定義 プロトコルが網羅的にチェックされる。

Slide 21

Slide 21 text

typed Actorの関数型スタイル AbstractBehaviorの代わりに、 より関数型のスタイルとして Behaviorsのファクトリーメソッドある。 (receiveなど) 状態をアクターに持たせたい場合に Immutableに定義することができる

Slide 22

Slide 22 text

Classic Actorの違い
 
 ● アクター間のメッセージの整合性がコンパイル時にチェックできる
 ○ TypedActorのメッセージの型を宣言する必要がある(強制される)
 ○ コンパイラーは、メッセージの受信者が送信中のメッセージを実際に処理でき るかどうかを静的にチェックできる。
 ● Actor内のmutableなコードがなくなり、ImmutableなコードでActorを実装できる。


Slide 23

Slide 23 text

項目
 Classic Actor API
 Typed Actor API
 アクター参照
 ActorRef
 ActorRef[T]
 アクターの構築
 extends Actor
 extends AbstractBehavior[T] 
 (オブジェクト指向スタイル) 
 子アクターの生成
 context.actorOf
 context.spawn
 ユーザーガーディアン 
 (/user)
 ActorSystemによって提供される 
 (ユーザーガーディアン) 
 ユーザーによって提供され、 ActorSystemにBehaviorを渡す。 
 デフォルトの
 スーパーバイザーの戦略 
 (監督戦略)
 例外が投げられた際に 
 子アクターを再起動する 
 例外が投げられた際に 
 子アクターを停止する 
 (let it crash)
 概念の比較表(厳密なマッピングの表ではない。)
 Tour of Akka Typed: Protocols and Behaviors  より


Slide 24

Slide 24 text

子アクターの生成
 spawnで子アクターを生成している 
 setupはBehaviorの
 ファクトリーの一つ
 またtyped actorにはPreStartとPostRestartシグナルがないので、Behaviors.setupや AbstractBehaviorクラスのコンストラクタから実行する。 


Slide 25

Slide 25 text

ユーザーガーディアン
 typed Akkaでは、アプリケーションのための追加アクタをユーザーガーディアンから追加 する。初期化を行うと同時に、ユーザーガーディアンから作られる。
 Classic ではActorSystemからactorOfで作っている。
 / /user /system ルートガーディアン
 /user/system

Slide 26

Slide 26 text

デフォルトのスーパーバイザーの戦略が異なる
 例外が発生した際にClassicActorは子を再起動する。typed Actorは停止させる。 
 typed Actorでも再起動の戦略をカスタマイズもできる。

Slide 27

Slide 27 text

さらに詳細な違いについてはドキュメントで ● Learning Akka Typed from Classic
 ● Tour of Akka Typed: Protocols and Behaviors

Slide 28

Slide 28 text

ご静聴ありがとうございました