Akka と Typeの話
-
Upload
huy-do -
Category
Engineering
-
view
1.545 -
download
1
Transcript of Akka と Typeの話
Akkaとtypeの話
CyberAgent アドテクスタジオ RightSegment
@dxhuy
自己紹介
• サイバーエージェントの15卒 • RightSegmentという子会社にいます • ベトナム出身 • Haskellわから無い • Ruby好き • ScalaをRubyぽく書きたい
Akkaって 型ないですよね
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
違う型送っているじゃん!!
あなた本当にScala 使っているの????
Why akka need type?
• scalaエンジニアは型が好き、コンパイル時にチェックが好き
• Actorに自由にMessage送ってもおっけ? • AskするときのFuture[AnyRef]で間違ってmapToしてもおっけ?
• sender()の雑扱い(相手わからないけど、まずReplyするw)
• Actor間の「契約」(Contract)的なもの欲しい • それでリファクタリングも楽に
Actor間の「契約」(Contract)的なもの
欲しい
やっぱり型ある方がいいよね
どうやって?
今の時点で選択肢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
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^/
• メリット
• Actorを合成できる (Streamみたい)
• デメリット
• 型を使いたいだけで完全新しいConcept生み出す?
• 結果的に2.4からtyped-channelサポートドロップされました
msg -?-> firstActor -?-> secondActor -?-> client msg -?-> someService -*-> (_ map httpOk) -!-> client
akka projectでの現在のakka-typedの話• Behavior is King! No more actor trait
• extends ActorでPartialFunctionの定義をやめ、挙動をBehaviorクラスで表現する
• 型Tは直接にActorRef[T]に渡す(つまり元のActorRefを廃棄) • Behavior[T], Props[T]
• sender()も廃棄
じゃ簡単コードを 見ましょう
他の機能• TotalのDSLでパターンマッチングのExhaustiveチェックができる • ↑の機能は型がないと絶対できないのでかなり嬉しい機能
• narrowメソッドにより型のContravariant実装可能
• || と && のDSLでBehaviorの合成 • ただ同じ型のBehaviorしか合成できない • かなり不思議 ( •̀ω•́ )σ
def narrow[U <: T]: Behavior[U] = this.asInstanceOf[Behavior[U]]
akka-typedの感想• sender()とか使えないとかなり不便 (╬ Ò ‸ Ó)
• そのせいでメッセージ毎にreplyToをパラメータとして追加しないといけない、あるいはList[ActorRef]みたいにActorRef登録
• Behaviorの合成便利そうだけど、使ってみると全く便利じゃないw(自分のイメージの合成と違う)
• 個人的に一番デメリットは • 型が無いAkkaを慣れている人だとすっごい使いづらい
他に選択肢ある?
突然の結論 typed-actorが 一番使い易い!
typed-actorとは?• akkaプロジェクトに関係無い3rdパーティライブラリ
• ライブラリの目的 • 既存のActorの上に、 小のオーバーヘッドの型実装
• 既存のActorとの互換性
そんなできるの?
さっそく 使ってみよ!
めっちゃくちゃ使いやすく無いです
か?
type-actorで嬉しいこと• 既存のAkkaプロジェクトの用語・概念が一致なのでAkka職人達は絶対嬉しい
• 型のUnionわかり易いし、使い易い • UnionはshapelessのAuxパターンで実装され、ソースも短くわかり易い
• Total DSLでreceiveのexhaustiveチェックも可能 • Type/Untyped, Safe/Unsafe Actorの切り替えも簡単
すごい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 -------------------------------------------------------------------------------
typed-actorのメリット• 既存の実装と合わすのが簡単 • 手軽の型Actor実装 • すごい軽い • Experimentalではない • やっぱりもうやめたいと思ったらすぐ切り離せる
結論 typed-actorが 一番使い易い!
みんなさんtyped-actor使いましょう!