SlideShare a Scribd company logo
1 of 29
AkkaのActorをなぜ使うのか?
~これから使う人向け~
ナイル株式会社 的場 勇樹
自己紹介
名前: 的場勇樹
- 先ほど紹介のあったAppliv Platform (Applivのデータを統括的に扱うやつ) で
Scalaを使って1年ほど開発をしていました。
Actorとは?
メッセージでやりとりするエンティティー
instance i1 instance i2
i2.method()
Actor a1 Actor a2
a2 ! “message”
「このメッセージを受け取った
らこういう処理をする」という
関数がこの中で定義されている
a2に”message”というstring
を送る
HelloActor MyActor
1. Hello
2. “what’s up?”
3. output “nothing”
Actorを使い始めた頃、こういうのを実現するときに
こんなコードを書いてて...
こんなコードを書いてて...
これでええやんと一瞬思ってました
「MyActor内の動作とHelloActor内の動作は
非同期になってるので、
非同期な処理を書きやすい」
って聞いたあとも
Futureでええやんとしばらく思ってました
Futureでええやんとしばらく思ってました
それでもなぜAkkaのActorを使うのか?
→ システムをReactiveにするため
Reactive Systemとは
以下の4つの要素に分けられる
- 目的 = 即応性 (Responsive): すぐレスポンス返す!エラーすぐ見つける!
- 戦略1 = 耐障害性 (Resilient): 障害に強い!
- 戦略2 = 弾力性 (Elastic): 冗長化して負荷分散するのが簡単!
- 戦術 = メッセージ駆動 (Message Driven): 各コンポーネントを疎結合にしや
すくてリソースも節約できる!
(戦略: 目的を達成するために注力すべきポイント)
(戦術: 戦略で決めた部分を改善するために取る具体的な方法)
上の説明はざっくりしすぎて誤解を生む可能性がなくもないので、
詳細はリアクティブ宣言を参照。
なるほど、という感じではあるけど抽象的
なのでピンと来ない
→ 実例を挙げていって、何が便利なのかを
比べていきましょう
1.Actor間の疎結合具合がすごい
疎結合だと何が良いのか
→ 遅延、障害の伝播を防ぐことができる
→ 耐障害性が高くなる
まだ抽象的なので具体例を見ていきましょう。
Instance A Instance B
2.call B’s method
Actorでないとき
1.call A’s method1
3.return value
Main
4.call A’s method2
ごめん、めっちゃ時
間かかってるじゃあ待つわ
method2の処理は?
すいません、まだBからレ
スポンス返ってこなく
て・・
Instance Bの遅延が全体に波及して
いる
Actor A Actor B
2.send message
Actorであるとき
1.send message1
3.send back response
Main
4.send message2
ごめん、めっちゃ時
間かかってる知らん
message2の処理は?
message1の処理終わった
んで、すぐやります!
Actor Bの遅延をActor B内に閉じ込めている。
(“4 send message2” の処理の影響がでない)
これはまあFutureでも解決できる
Instance A Instance B
2.call B’s method
Actorでないとき
1.call A’s method1
3.return value
Main
4.call A’s method2
エラー出たので死に
ます・・
その影響で俺
も・・
じゃあ俺も・・
Instance Bの遅延が全体に波及して
いる
Actor A Actor B
2.send message
Actorであるとき
1.send message1
3.send back response
Main
4.send message2
エラー出たので死に
ます!知らん
message2の処理は?
message1の処理終わった
んで、すぐやります!
Actor Bでの障害をActor B内に閉じ込
めれる (4の処理に影響が出ない)
Actor Bに親アクターがいるとき、親
アクターがクラッシュ時の挙動を決
定できる (Let it crashの16ページ目か
ら)
ActorLogging, ScalaLogging
などで、どのアクターでどん
なエラーが出たのかは記録で
きる 詳細
2. Messageを順次処理するので過負荷を防げる
1. Actorに届けられたメッセージはそのActorのMessage Queueに格納される
2. Message Queueからメッセージを取り出す
3. そのメッセージに基づいた処理を開始
4. 現在の処理が終わったらMessage Queueから次のメッセージを取り出す
って感じでActorは一つずつ処理をする
具体的に何が良いのか見ていきましょう。
Instance A
Instance E
1. call E’s update method
Actorでないとき
Instance B DB
2. update by A’s request
1.call E’s update method
Instance C
1.call E’s update method
2. update by B’s request
2. update by C’s request
そんないっぺんにいっぱい来られて
も無理。
Actor A
Actor E
1. send update message
Actorであるとき
Actor B DB
2. update by A’s message
1.send update message
Actor C
1.send update message
3. update by B’s message
4. update by C’s message
一つずつくるから、負荷も安心
※デッドロックの心配もなし
Actor間は非同期なので、Actor Eにメ
ッセージが溜まっても他のActorには
関係なし
UnboundedPriorityMailboxを使用する
ことでメッセージの優先度も設定可
能 詳細
3. 並列度の操作や冗長化が簡単
単一責務の原則に基づいてActorが設計されているとすると、
「ある処理が重い」 → 「その処理をしているActorを増やそう」
で解決することが多いはず。その増えたActorに処理を振り分ける方法が
- Akka Router これ のスライドの37ページ目から
- RemoteActor 詳細
- ClusterActor 詳細
などと、色々揃っているので順番に見ていきましょう
Router
val actor = system.actorOf(Props[MyActor])
actor ! “message 1”
actor ! “message 2”
actor ! “message 3”
val actor =
system.actorOf(Props[MyActor].withRouter(RoundRobi
nRouter(nOfInstances = 3))
actor ! “message 1”
actor ! “message 2”
actor ! “message 3”
MyActor
“message 1”
“message 2”
“message 3”
MyActor MyActor MyActor
Router
“message 1”
“message 2”
“message 3”
“message 2” “message 3”
“message 1”
RemoteActor
RouterでMyActorの並列度は操作できた
→ でもサーバー1台のリソースは限られているので、並列処理しすぎて過負荷に
なってしまったとする
→Actorを別のサーバーで動かしてそこにメッセージを投げたい
RemoteActorなら、わざわざHTTPのAPIを用意しなくてもサーバーをまたいで
Actorがメッセージをやりとりできる。
(各アクターにはPath(アドレス)があるので、そのPathを指定して、別サーバーの
Actorを参照できる)
RemoteActor
IP: 192.168.33.20
val system = ActorSystem(“my-system”)
val actor = system.actorOf(Props[MyActor], “my-
actor”)
application.conf
{
/*他の設定も本当は書く*/
remote {
hostname = “192.168.33.20”
port = 2552
}
}
IP: 192.168.33.21
val system = ActorSystem(“my-system”)
val path = “akka.tcp://my-
system@192.168.33.20:2552/user/my-actor”
//ActorSystem名、host, port, Actor名でActorの
ユニークなアドレスを指定
val actor = system.actorSelection(path)
//↑ で別サーバーにあるMyActorの参照を得た。
actor ! “message”
//↑ で別サーバーにあるMyActorにメッセージを
投げている。
ClusterActor (cluster client)
IP: 192.168.33.10IP: 192.168.33.11
ClusterClient “message”
“message”
ClusterActor (cluster client)
IP: 192.168.33.10IP: 192.168.33.11IP: 192.168.33.12
ClusterClient “message”
seedを指定してActorSystemを起動
まとめ
- Actorはメッセージ駆動なので、Reactive Systemを実現しやすくなる
- Actor間はめっちゃ疎結合なので、遅延やエラーの伝播を防げる
- Actorを使うことで負荷の調節が簡単にできる
- サーバーをまたいでシステムを冗長化することも簡単にできる
最後に
AkkaにはActor以外にも(Akka Streamなど)、Reactive Systemを実現するためのラ
イブラリが色々用意されていて、開発がかなり活発なので是非注目していきまし
ょう。
Akka Streamの詳細
Akka Streamの詳細2
ご清聴ありがとうございました!

More Related Content

What's hot

What's hot (20)

Python 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそうPython 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそう
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
 
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
 
Serverless時代のJavaについて
Serverless時代のJavaについてServerless時代のJavaについて
Serverless時代のJavaについて
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
 
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
 
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
 
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
 
ゲームアーキテクチャパターン (Aurora Serverless / DynamoDB)
ゲームアーキテクチャパターン (Aurora Serverless / DynamoDB)ゲームアーキテクチャパターン (Aurora Serverless / DynamoDB)
ゲームアーキテクチャパターン (Aurora Serverless / DynamoDB)
 
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
 
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~ CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
 
イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
 
AWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティス
 
GraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ることGraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ること
 
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
 
backlogsでもCI/CDする夢を見る
backlogsでもCI/CDする夢を見るbacklogsでもCI/CDする夢を見る
backlogsでもCI/CDする夢を見る
 

Viewers also liked

Viewers also liked (7)

Developing an Akka Edge4-5
Developing an Akka Edge4-5Developing an Akka Edge4-5
Developing an Akka Edge4-5
 
PHP開発者がScalaに入門して苦しんだ話
PHP開発者がScalaに入門して苦しんだ話PHP開発者がScalaに入門して苦しんだ話
PHP開発者がScalaに入門して苦しんだ話
 
Developing an Akka Edge6
Developing an Akka Edge6Developing an Akka Edge6
Developing an Akka Edge6
 
Reactive Design Patterns: a talk by Typesafe's Dr. Roland Kuhn
Reactive Design Patterns: a talk by Typesafe's Dr. Roland KuhnReactive Design Patterns: a talk by Typesafe's Dr. Roland Kuhn
Reactive Design Patterns: a talk by Typesafe's Dr. Roland Kuhn
 
Developing an Akka Edge1-3
Developing an Akka Edge1-3Developing an Akka Edge1-3
Developing an Akka Edge1-3
 
Zen of Akka
Zen of AkkaZen of Akka
Zen of Akka
 
Rakuten Technology Conference 2017 A Distributed SQL Database For Data Analy...
Rakuten Technology Conference 2017 A Distributed SQL Database  For Data Analy...Rakuten Technology Conference 2017 A Distributed SQL Database  For Data Analy...
Rakuten Technology Conference 2017 A Distributed SQL Database For Data Analy...
 

Similar to Akka actorを何故使うのか?

Similar to Akka actorを何故使うのか? (12)

ATN No.2 Scala事始め
ATN No.2 Scala事始めATN No.2 Scala事始め
ATN No.2 Scala事始め
 
WebSocket+Akka(Remote)+Play 2.1 Java
WebSocket+Akka(Remote)+Play 2.1 JavaWebSocket+Akka(Remote)+Play 2.1 Java
WebSocket+Akka(Remote)+Play 2.1 Java
 
AKS と ACI を組み合わせて使ってみた
AKS と ACI を組み合わせて使ってみたAKS と ACI を組み合わせて使ってみた
AKS と ACI を組み合わせて使ってみた
 
Rust Error Handling
Rust Error HandlingRust Error Handling
Rust Error Handling
 
Maiking RIA Apps by Ruby
Maiking RIA Apps by RubyMaiking RIA Apps by Ruby
Maiking RIA Apps by Ruby
 
Operator reading and writing ( Operator SDK 編 )
Operator reading and writing ( Operator SDK 編 )Operator reading and writing ( Operator SDK 編 )
Operator reading and writing ( Operator SDK 編 )
 
SDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireSDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 Whire
 
Tiny server
Tiny serverTiny server
Tiny server
 
Akka stream
Akka streamAkka stream
Akka stream
 
Play jjug2012spring
Play jjug2012springPlay jjug2012spring
Play jjug2012spring
 
cloudpack負荷職人結果レポート(サンプル)
cloudpack負荷職人結果レポート(サンプル)cloudpack負荷職人結果レポート(サンプル)
cloudpack負荷職人結果レポート(サンプル)
 
ゆるかわPhp
ゆるかわPhpゆるかわPhp
ゆるかわPhp
 

Recently uploaded

Recently uploaded (7)

Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 

Akka actorを何故使うのか?

Editor's Notes

  1. 今日はこれからScalaを本格的に使おうとする人のために、「AkkaのActorをなぜ使うのか?」というテーマで話したいと思います。 その前にそもそも「なぜActorの話をするのか」ということなんですけど、Scalaにはakkaというかなり便利なライブラリ集みたいなのがあって、 Actorはその中でも中心的な役割を担っているので、今回テーマに選びました。 ちなみにこのakkaのActorを趣味でもなんでも触ったことあるっていう人はどれくらいいますか?
  2. まずActorそのものの説明をさらっとしようかと思うんですが、Actorを一言で言うと「メッセージでやりとりするエンティティー」と言えます。 要は、普通のオブジェクトだと、オブジェクト間でやりとりをするときに「相手のオブジェクトのメソッドを呼ぶ」という方法が一般的だと思うのですが、 Actorでは「相手のActorにメッセージを送る」という方法をとります。 スライドだと a2というアクターに”message”というstringを送ることでa1とa2はやりとりをします。 そしてa2には「”message”というstringを受け取ったらDBにデータ格納する」みたいな処理が書かれていたりします。
  3. そのActorを使って、このようなシンプルなプログラムを作ろうしているとしましょう。 HelloActorがHelloというメッセージをMyActorに投げたら “what’s up” って返ってきて、 それが返ってきたら HelloActorは “nothing”と出力する というシンプルなやつです。
  4. これを実現するためにこのようなコードを書きました。 まずHelloActorの定義があります。 HelloActorの中でmyActorを生成してます。 ほんでHelloActorはStartという上で定義したcase objectを受け取ったら Helloというcase objectをMyActorに投げます。 そして “what’s up?” というstringを受け取ったら”nothing”と出力します。 case objectを使ったりstringを使ったりしている理由はActorが受け取るメッセージはどんな型でも大丈夫だということを示すためです。
  5. 次にMyActorの定義を書いています。 シンプルに「Helloというcase objectを受け取ったら、送り主に “what’s up?”というstringを返す。」 という処理を書いています。 これで<3まいめスライドに戻る>この流れを再現するわけです。 MyActorの下にはBootというobjectがあって、コメントにも書いてますが、これはMain関数のようなものです。 ここでまずActorの大元になるActorSystemを生成します。で、そのActorSystemからHelloActorを生成して、 HelloActorにStartというcase objectのメッセージを投げるわけですね。 そしたら<3まいめスライドに戻る>この流れが始まるわけです。 まあ、こんなコードを書いてた当初、
  6. もうこれでええやんと思ってました。 ここではシンプルにインスタンスを生成してメソッドを呼ぶことでstart -> “what’s up?”を受け取る -> “nothing”を出力しています。 こっちの方が短いですね。
  7. <スライドの内容を読む> 要はMyActorで何か処理しながら、同時にHelloActorで別の処理ができるってことなんですけど、 これを聞いた後も
  8. Futureでええやんと思ってたんですね。 ScalaにはFutureっていう便利なものがあって、このスライドのようにFutureで囲むだけで中の処理が非同期になります。 細かくはExecutionContextとかを管理しないとうまく非同期にならないこともあるんですが、それは今回割愛します。 上の例のようにもしhearHelloメソッドがめっちゃ時間のかかる処理をしていたとしても
  9. Futureで囲ってあるので、hearHelloメソッドの後のコメント部分のコードはhearHelloの実行終了を待たなくても実行されます。 ちなみにこのmapの中身はhearHelloメソッドのコールバック関数的な役割をします。 これで見事にhearHelloの処理とstartメソッド内の処理を簡単に非同期にできました。
  10. では、なぜそれでもAkkaのActorを使うのか、というと システムをReactiveにするためです。
  11. Reactive Systemとは何かというと、 まず目的は速くレスポンスを返すことです。 そして今の時代、どこがすごかったらレスポンスが早く返せるかっていうのが次の2項目である 耐障害性と弾力性になります。障害に強い!っていうのと負荷分散するのが簡単ってことですね。 そして、その耐障害性と弾力性を高めるために具体的にどういう手法をとるかというのが、その下の 「メッセージ駆動」ということになります。 Actorは先ほど説明した通りメッセージでやりとりをする「メッセージ駆動」なので、Actorを使うと 要は上の2項目である障害に強くて負荷分散するのが簡単になって、結果的にいつでも速くレスポンスが返せるようになるよってことです。