SlideShare uma empresa Scribd logo
1 de 28
Baixar para ler offline
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!
https://github.com/
knutwalker/typed-actors
突然の結論
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使いましょう!

Mais conteúdo relacionado

Mais procurados

Dark vol4 for_slideshare
Dark vol4 for_slideshareDark vol4 for_slideshare
Dark vol4 for_slideshareara_ta3
 
Scalaで学ぶ関数型言語超入門
Scalaで学ぶ関数型言語超入門Scalaで学ぶ関数型言語超入門
Scalaで学ぶ関数型言語超入門yujiro_t
 
Scala超入門 - 2014/12/13 Scala関西勉強会
Scala超入門 - 2014/12/13 Scala関西勉強会Scala超入門 - 2014/12/13 Scala関西勉強会
Scala超入門 - 2014/12/13 Scala関西勉強会Asami Abe
 
AWS Amplify XRを動かしてみたら、、、
AWS Amplify XRを動かしてみたら、、、AWS Amplify XRを動かしてみたら、、、
AWS Amplify XRを動かしてみたら、、、Tsuyoshi Yamamoto
 
Scalaで学ぶ関数型超入門
Scalaで学ぶ関数型超入門Scalaで学ぶ関数型超入門
Scalaで学ぶ関数型超入門Yuichiro Takahashi
 
Shinjuku.rb #29 ActiveJobでSQS使ったのとその永続化についての話
Shinjuku.rb #29 ActiveJobでSQS使ったのとその永続化についての話Shinjuku.rb #29 ActiveJobでSQS使ったのとその永続化についての話
Shinjuku.rb #29 ActiveJobでSQS使ったのとその永続化についての話Takeuchi Yuichi
 
おっさんES6/ES2015,React.jsを学ぶ
おっさんES6/ES2015,React.jsを学ぶおっさんES6/ES2015,React.jsを学ぶ
おっさんES6/ES2015,React.jsを学ぶdcubeio
 
Rxjavaとoptionalで関数型androidしよう
Rxjavaとoptionalで関数型androidしようRxjavaとoptionalで関数型androidしよう
Rxjavaとoptionalで関数型androidしようFumihiko Shiroyama
 

Mais procurados (9)

Dark vol4 for_slideshare
Dark vol4 for_slideshareDark vol4 for_slideshare
Dark vol4 for_slideshare
 
Scalaで学ぶ関数型言語超入門
Scalaで学ぶ関数型言語超入門Scalaで学ぶ関数型言語超入門
Scalaで学ぶ関数型言語超入門
 
Scala超入門 - 2014/12/13 Scala関西勉強会
Scala超入門 - 2014/12/13 Scala関西勉強会Scala超入門 - 2014/12/13 Scala関西勉強会
Scala超入門 - 2014/12/13 Scala関西勉強会
 
AWS Amplify XRを動かしてみたら、、、
AWS Amplify XRを動かしてみたら、、、AWS Amplify XRを動かしてみたら、、、
AWS Amplify XRを動かしてみたら、、、
 
Build Dockferile with Haskell
Build Dockferile with HaskellBuild Dockferile with Haskell
Build Dockferile with Haskell
 
Scalaで学ぶ関数型超入門
Scalaで学ぶ関数型超入門Scalaで学ぶ関数型超入門
Scalaで学ぶ関数型超入門
 
Shinjuku.rb #29 ActiveJobでSQS使ったのとその永続化についての話
Shinjuku.rb #29 ActiveJobでSQS使ったのとその永続化についての話Shinjuku.rb #29 ActiveJobでSQS使ったのとその永続化についての話
Shinjuku.rb #29 ActiveJobでSQS使ったのとその永続化についての話
 
おっさんES6/ES2015,React.jsを学ぶ
おっさんES6/ES2015,React.jsを学ぶおっさんES6/ES2015,React.jsを学ぶ
おっさんES6/ES2015,React.jsを学ぶ
 
Rxjavaとoptionalで関数型androidしよう
Rxjavaとoptionalで関数型androidしようRxjavaとoptionalで関数型androidしよう
Rxjavaとoptionalで関数型androidしよう
 

Destaque

Scalaプロジェクトへの未経験者の円滑なジョインへ
Scalaプロジェクトへの未経験者の円滑なジョインへScalaプロジェクトへの未経験者の円滑なジョインへ
Scalaプロジェクトへの未経験者の円滑なジョインへKenji Doi
 
[Scalameetup]spark shuffle
[Scalameetup]spark shuffle[Scalameetup]spark shuffle
[Scalameetup]spark shuffleHuy Do
 
Consistent Hashingの小ネタ
Consistent Hashingの小ネタConsistent Hashingの小ネタ
Consistent Hashingの小ネタHuy Do
 
Itlc2015
Itlc2015Itlc2015
Itlc2015Huy Do
 
Thriftを用いた分散型のNyancatを作ってきた
Thriftを用いた分散型のNyancatを作ってきたThriftを用いた分散型のNyancatを作ってきた
Thriftを用いた分散型のNyancatを作ってきたHuy Do
 
DI in ruby
DI in rubyDI in ruby
DI in rubyHuy Do
 
実践Akka
実践Akka実践Akka
実践AkkaHuy Do
 
中島裕介「最強のリベラルアーツとしての短歌Ⅱ」(於・大阪大学)1日目 2015年11月27日
中島裕介「最強のリベラルアーツとしての短歌Ⅱ」(於・大阪大学)1日目 2015年11月27日 中島裕介「最強のリベラルアーツとしての短歌Ⅱ」(於・大阪大学)1日目 2015年11月27日
中島裕介「最強のリベラルアーツとしての短歌Ⅱ」(於・大阪大学)1日目 2015年11月27日 yukashima
 
中島裕介「最強のリベラルアーツとしての短歌Ⅱ」(於・大阪大学)2日目 2015年12月4日
中島裕介「最強のリベラルアーツとしての短歌Ⅱ」(於・大阪大学)2日目 2015年12月4日 中島裕介「最強のリベラルアーツとしての短歌Ⅱ」(於・大阪大学)2日目 2015年12月4日
中島裕介「最強のリベラルアーツとしての短歌Ⅱ」(於・大阪大学)2日目 2015年12月4日 yukashima
 
NoSQL for great good [hanoi.rb talk]
NoSQL for great good [hanoi.rb talk]NoSQL for great good [hanoi.rb talk]
NoSQL for great good [hanoi.rb talk]Huy Do
 
【D3 公開用】ドメイン駆動設計とscala 〜既存プロジェクトへの適用〜
【D3 公開用】ドメイン駆動設計とscala 〜既存プロジェクトへの適用〜 【D3 公開用】ドメイン駆動設計とscala 〜既存プロジェクトへの適用〜
【D3 公開用】ドメイン駆動設計とscala 〜既存プロジェクトへの適用〜 dcubeio
 
Akka Cluster and Auto-scaling
Akka Cluster and Auto-scalingAkka Cluster and Auto-scaling
Akka Cluster and Auto-scalingIkuo Matsumura
 
Spark GraphX で始めるグラフ解析
Spark GraphX で始めるグラフ解析Spark GraphX で始めるグラフ解析
Spark GraphX で始めるグラフ解析Yosuke Mizutani
 
Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek
Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageekJava エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek
Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageekKazuhiro Sera
 
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24Kazuhiro Sera
 
Tuna: Elect the Perfect Protein Catch [INFOGRAPHIC]
Tuna: Elect the Perfect Protein Catch [INFOGRAPHIC]Tuna: Elect the Perfect Protein Catch [INFOGRAPHIC]
Tuna: Elect the Perfect Protein Catch [INFOGRAPHIC]Food Insight
 
Types of music videos and adverts
Types of music videos and advertsTypes of music videos and adverts
Types of music videos and advertsTom Lord
 
你沒看到的北京奧運開幕式
你沒看到的北京奧運開幕式你沒看到的北京奧運開幕式
你沒看到的北京奧運開幕式honan4108
 

Destaque (20)

Scalaプロジェクトへの未経験者の円滑なジョインへ
Scalaプロジェクトへの未経験者の円滑なジョインへScalaプロジェクトへの未経験者の円滑なジョインへ
Scalaプロジェクトへの未経験者の円滑なジョインへ
 
[Scalameetup]spark shuffle
[Scalameetup]spark shuffle[Scalameetup]spark shuffle
[Scalameetup]spark shuffle
 
Consistent Hashingの小ネタ
Consistent Hashingの小ネタConsistent Hashingの小ネタ
Consistent Hashingの小ネタ
 
Itlc2015
Itlc2015Itlc2015
Itlc2015
 
Thriftを用いた分散型のNyancatを作ってきた
Thriftを用いた分散型のNyancatを作ってきたThriftを用いた分散型のNyancatを作ってきた
Thriftを用いた分散型のNyancatを作ってきた
 
DI in ruby
DI in rubyDI in ruby
DI in ruby
 
実践Akka
実践Akka実践Akka
実践Akka
 
中島裕介「最強のリベラルアーツとしての短歌Ⅱ」(於・大阪大学)1日目 2015年11月27日
中島裕介「最強のリベラルアーツとしての短歌Ⅱ」(於・大阪大学)1日目 2015年11月27日 中島裕介「最強のリベラルアーツとしての短歌Ⅱ」(於・大阪大学)1日目 2015年11月27日
中島裕介「最強のリベラルアーツとしての短歌Ⅱ」(於・大阪大学)1日目 2015年11月27日
 
中島裕介「最強のリベラルアーツとしての短歌Ⅱ」(於・大阪大学)2日目 2015年12月4日
中島裕介「最強のリベラルアーツとしての短歌Ⅱ」(於・大阪大学)2日目 2015年12月4日 中島裕介「最強のリベラルアーツとしての短歌Ⅱ」(於・大阪大学)2日目 2015年12月4日
中島裕介「最強のリベラルアーツとしての短歌Ⅱ」(於・大阪大学)2日目 2015年12月4日
 
NoSQL for great good [hanoi.rb talk]
NoSQL for great good [hanoi.rb talk]NoSQL for great good [hanoi.rb talk]
NoSQL for great good [hanoi.rb talk]
 
【D3 公開用】ドメイン駆動設計とscala 〜既存プロジェクトへの適用〜
【D3 公開用】ドメイン駆動設計とscala 〜既存プロジェクトへの適用〜 【D3 公開用】ドメイン駆動設計とscala 〜既存プロジェクトへの適用〜
【D3 公開用】ドメイン駆動設計とscala 〜既存プロジェクトへの適用〜
 
Akka Cluster and Auto-scaling
Akka Cluster and Auto-scalingAkka Cluster and Auto-scaling
Akka Cluster and Auto-scaling
 
Spark GraphX で始めるグラフ解析
Spark GraphX で始めるグラフ解析Spark GraphX で始めるグラフ解析
Spark GraphX で始めるグラフ解析
 
Spark Security
Spark SecuritySpark Security
Spark Security
 
Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek
Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageekJava エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek
Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek
 
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
 
Tuna: Elect the Perfect Protein Catch [INFOGRAPHIC]
Tuna: Elect the Perfect Protein Catch [INFOGRAPHIC]Tuna: Elect the Perfect Protein Catch [INFOGRAPHIC]
Tuna: Elect the Perfect Protein Catch [INFOGRAPHIC]
 
Chap004
Chap004Chap004
Chap004
 
Types of music videos and adverts
Types of music videos and advertsTypes of music videos and adverts
Types of music videos and adverts
 
你沒看到的北京奧運開幕式
你沒看到的北京奧運開幕式你沒看到的北京奧運開幕式
你沒看到的北京奧運開幕式
 

Mais de Huy Do

Distributed Tracing, from internal SAAS insights
Distributed Tracing, from internal SAAS insightsDistributed Tracing, from internal SAAS insights
Distributed Tracing, from internal SAAS insightsHuy Do
 
Write on memory TSDB database (gocon tokyo autumn 2018)
Write on memory TSDB database (gocon tokyo autumn 2018)Write on memory TSDB database (gocon tokyo autumn 2018)
Write on memory TSDB database (gocon tokyo autumn 2018)Huy Do
 
Some note about GC algorithm
Some note about GC algorithmSome note about GC algorithm
Some note about GC algorithmHuy Do
 
Engineering Efficiency in LINE
Engineering Efficiency in LINEEngineering Efficiency in LINE
Engineering Efficiency in LINEHuy Do
 
GOCON Autumn (Story of our own Monitoring Agent in golang)
GOCON Autumn (Story of our own Monitoring Agent in golang)GOCON Autumn (Story of our own Monitoring Agent in golang)
GOCON Autumn (Story of our own Monitoring Agent in golang)Huy Do
 
Story Writing Byte Serializer in Golang
Story Writing Byte Serializer in GolangStory Writing Byte Serializer in Golang
Story Writing Byte Serializer in GolangHuy Do
 
CA15卒勉強会 メタプログラミングについて
CA15卒勉強会 メタプログラミングについてCA15卒勉強会 メタプログラミングについて
CA15卒勉強会 メタプログラミングについてHuy Do
 
Making CLI app in ruby
Making CLI app in rubyMaking CLI app in ruby
Making CLI app in rubyHuy Do
 
CacheとRailsの簡単まとめ
CacheとRailsの簡単まとめCacheとRailsの簡単まとめ
CacheとRailsの簡単まとめHuy Do
 
[Htmlday]present
[Htmlday]present[Htmlday]present
[Htmlday]presentHuy Do
 

Mais de Huy Do (10)

Distributed Tracing, from internal SAAS insights
Distributed Tracing, from internal SAAS insightsDistributed Tracing, from internal SAAS insights
Distributed Tracing, from internal SAAS insights
 
Write on memory TSDB database (gocon tokyo autumn 2018)
Write on memory TSDB database (gocon tokyo autumn 2018)Write on memory TSDB database (gocon tokyo autumn 2018)
Write on memory TSDB database (gocon tokyo autumn 2018)
 
Some note about GC algorithm
Some note about GC algorithmSome note about GC algorithm
Some note about GC algorithm
 
Engineering Efficiency in LINE
Engineering Efficiency in LINEEngineering Efficiency in LINE
Engineering Efficiency in LINE
 
GOCON Autumn (Story of our own Monitoring Agent in golang)
GOCON Autumn (Story of our own Monitoring Agent in golang)GOCON Autumn (Story of our own Monitoring Agent in golang)
GOCON Autumn (Story of our own Monitoring Agent in golang)
 
Story Writing Byte Serializer in Golang
Story Writing Byte Serializer in GolangStory Writing Byte Serializer in Golang
Story Writing Byte Serializer in Golang
 
CA15卒勉強会 メタプログラミングについて
CA15卒勉強会 メタプログラミングについてCA15卒勉強会 メタプログラミングについて
CA15卒勉強会 メタプログラミングについて
 
Making CLI app in ruby
Making CLI app in rubyMaking CLI app in ruby
Making CLI app in ruby
 
CacheとRailsの簡単まとめ
CacheとRailsの簡単まとめCacheとRailsの簡単まとめ
CacheとRailsの簡単まとめ
 
[Htmlday]present
[Htmlday]present[Htmlday]present
[Htmlday]present
 

Akka と Typeの話