Akka と Typeの話

28
Akkaとtypeの話 CyberAgent アドテクスタジオ RightSegment @dxhuy

Transcript of Akka と Typeの話

Page 1: Akka と Typeの話

Akkaとtypeの話

CyberAgent アドテクスタジオ RightSegment

@dxhuy

Page 2: Akka と Typeの話

自己紹介

• サイバーエージェントの15卒 • RightSegmentという子会社にいます • ベトナム出身 • Haskellわから無い • Ruby好き • ScalaをRubyぽく書きたい

Page 3: Akka と Typeの話

Akkaって 型ないですよね

Page 4: Akka と Typeの話

trait Request case class Command(msg: String) extends Request trait Reply case object CommandSuccess extends Reply case class CommandFailure(msg: String) extends Reply

val requestProcessor = someActor requestProcessor ! Command

違う型送っているじゃん!!

Page 5: Akka と Typeの話

あなた本当にScala 使っているの????

Page 6: Akka と Typeの話

Why akka need type?

• scalaエンジニアは型が好き、コンパイル時にチェックが好き

• Actorに自由にMessage送ってもおっけ? • AskするときのFuture[AnyRef]で間違ってmapToしてもおっけ?

• sender()の雑扱い(相手わからないけど、まずReplyするw)

• Actor間の「契約」(Contract)的なもの欲しい • それでリファクタリングも楽に

Page 7: Akka と Typeの話

Actor間の「契約」(Contract)的なもの

欲しい

Page 8: Akka と Typeの話

やっぱり型ある方がいいよね

Page 9: Akka と Typeの話

どうやって?

Page 10: Akka と Typeの話

今の時点で選択肢3つ

• akka projectのExperimental 「akka-typed」 • (古い)akkaの2.3系に存在した「typed-channel」

• http://doc.akka.io/docs/akka/snapshot/scala/typed.html

• 3rdのプロジェクト「typed-actors」 • https://github.com/knutwalker/typed-actors

Page 11: Akka と Typeの話

akka projectでの昔のTyped Channelの話• Actorの上にparameterizedされている層を作る

• 「Channel」と呼ぶ

• Channelの型定義:type Channel[I, O] = (I, O)

• Channelの合成もできる: • (MsgA, MsgB) :+: (MsgC, MsgD) :+: TNil

• 型計算はmacroで実装されている • 理論はπ-代数をベースしたみたい(process calculus) (https://en.wikipedia.org/wiki/%CE%A0-calculus)

val requestProcessor = new ChannelRef[(Request, Reply) :+: TNil](someActor) requestProcessor <-!- Command //コンパイルされていないよ \^o^/

Page 12: Akka と Typeの話

• メリット

• Actorを合成できる (Streamみたい)

• デメリット

• 型を使いたいだけで完全新しいConcept生み出す?

• 結果的に2.4からtyped-channelサポートドロップされました

msg -?-> firstActor -?-> secondActor -?-> client msg -?-> someService -*-> (_ map httpOk) -!-> client

Page 13: Akka と Typeの話

akka projectでの現在のakka-typedの話• Behavior is King! No more actor trait

• extends ActorでPartialFunctionの定義をやめ、挙動をBehaviorクラスで表現する

• 型Tは直接にActorRef[T]に渡す(つまり元のActorRefを廃棄) • Behavior[T], Props[T]

• sender()も廃棄

Page 14: Akka と Typeの話

じゃ簡単コードを 見ましょう

Page 15: Akka と Typeの話

他の機能• TotalのDSLでパターンマッチングのExhaustiveチェックができる • ↑の機能は型がないと絶対できないのでかなり嬉しい機能

• narrowメソッドにより型のContravariant実装可能

• || と && のDSLでBehaviorの合成 • ただ同じ型のBehaviorしか合成できない • かなり不思議 ( •̀ω•́ )σ

def narrow[U <: T]: Behavior[U] = this.asInstanceOf[Behavior[U]]

Page 16: Akka と Typeの話

akka-typedの感想• sender()とか使えないとかなり不便 (╬ Ò ‸ Ó)

• そのせいでメッセージ毎にreplyToをパラメータとして追加しないといけない、あるいはList[ActorRef]みたいにActorRef登録

• Behaviorの合成便利そうだけど、使ってみると全く便利じゃないw(自分のイメージの合成と違う)

• 個人的に一番デメリットは • 型が無いAkkaを慣れている人だとすっごい使いづらい

Page 17: Akka と Typeの話

他に選択肢ある?

Page 18: Akka と Typeの話

typed-actor!https://github.com/

knutwalker/typed-actors

Page 19: Akka と Typeの話

突然の結論 typed-actorが 一番使い易い!

Page 20: Akka と Typeの話

typed-actorとは?• akkaプロジェクトに関係無い3rdパーティライブラリ

• ライブラリの目的 • 既存のActorの上に、 小のオーバーヘッドの型実装

• 既存のActorとの互換性

Page 21: Akka と Typeの話

そんなできるの?

Page 22: Akka と Typeの話

さっそく 使ってみよ!

Page 23: Akka と Typeの話

めっちゃくちゃ使いやすく無いです

か?

Page 24: Akka と Typeの話

type-actorで嬉しいこと• 既存のAkkaプロジェクトの用語・概念が一致なのでAkka職人達は絶対嬉しい

• 型のUnionわかり易いし、使い易い • UnionはshapelessのAuxパターンで実装され、ソースも短くわかり易い

• Total DSLでreceiveのexhaustiveチェックも可能 • Type/Untyped, Safe/Unsafe Actorの切り替えも簡単

Page 25: Akka と Typeの話

すごいLiteライブラリcur-project/readsource/typed-actors master ✗ 66d ⚑ ▶ cloc . 351 text files. 254 unique files. 200 files ignored.

http://cloc.sourceforge.net v 1.64 T=3.29 s (54.2 files/s, 5646.3 lines/s) ------------------------------------------------------------------------------- Language files blank comment code ------------------------------------------------------------------------------- XML 137 0 0 14175 Scala 23 440 881 1680 XSLT 1 30 16 468 CSS 2 72 29 316 SASS 4 35 12 188 HTML 6 7 0 128 YAML 3 7 0 48 Javascript 2 0 1 16 ------------------------------------------------------------------------------- SUM: 178 591 939 17019 -------------------------------------------------------------------------------

Page 26: Akka と Typeの話

typed-actorのメリット• 既存の実装と合わすのが簡単 • 手軽の型Actor実装 • すごい軽い • Experimentalではない • やっぱりもうやめたいと思ったらすぐ切り離せる

Page 27: Akka と Typeの話

結論 typed-actorが 一番使い易い!

Page 28: Akka と Typeの話

みんなさんtyped-actor使いましょう!