Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Akka と Typeの話

2,509 views

Published on

Akka と Typeの話

Published in: Engineering
  • Login to see the comments

Akka と Typeの話

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

×