Slide 1

Slide 1 text

by しんぺい a.k.a. 猫型蓄音機 concurrency programming with Akka

Slide 2

Slide 2 text

で、誰? • 猫型蓄音機 とか しんぺいさんとか • お仕事では Ruby, Scala • 趣味でも Ruby, Scala • たまに Perl

Slide 3

Slide 3 text

第一部 並行処理とその課題

Slide 4

Slide 4 text

逐次処理と並行処理 • 逐次処理 • 実行順序が保証されている • 並行処理 • 実行順序が保証されていない

Slide 5

Slide 5 text

逐次処理

Slide 6

Slide 6 text

並行処理

Slide 7

Slide 7 text

並行処理

Slide 8

Slide 8 text

並行処理と並列処理 • 並行処理 • 同時に実行される処理は一個だけかもし れない(=CPUは一個かもしれない) • 並列処理 • 同時に複数の処理が実行される(=複数の CPUが同時に処理を行っている)

Slide 9

Slide 9 text

例えば • CRuby1.8までは、複数スレッドを利 用してもCPUはひとつしか使ってい なかった(= 並行処理ではあるが並 列処理ではない) • 1.9からは複数CPUで計算するように なった(= 並行処理かつ並列処理)

Slide 10

Slide 10 text

並行処理の課題1 • 処理の順序が保証されない = どこ で誰がメモリのどの部分を触るかわ からない • 複数のスレッドで共有されるデータ に関してはロックなどの工夫が必要

Slide 11

Slide 11 text

• ロック獲得し忘れてデータこわしま した • デッドロックになってシステムが停 止しました • テストしにくすぎ問題 並行処理の課題1

Slide 12

Slide 12 text

並行処理の課題2 • 処理の順序が保証されないのでどこ で例外ハンドリングするかめっちゃ 悩む • 例外は一種の goto です

Slide 13

Slide 13 text

第二部 Actor Model

Slide 14

Slide 14 text

辛みをコントロールする Q: なんでロックが必要なの? A: ひとつのデータをみんなで触るか ら Q: じゃあそもそもデータ共有しな きゃよくない? A: アッハイ

Slide 15

Slide 15 text

例えばDLのプログレスバー UIスレッド DLスレッド 進捗率 DLを依頼 content 共有

Slide 16

Slide 16 text

UIアクター DLアクター DLを依頼 進捗報告 進捗報告 進捗報告 進捗報告 content 例えばDLのプログレスバー

Slide 17

Slide 17 text

辛みをコントロールする • 非同期の例外ハンドリングめっちゃ 大変 • じゃあ、例外が起こったらリカバリ しないで壊しちゃえ、壊れたらもっ かい新しいアクター作ろう! • Let it crash!!!!!!!!

Slide 18

Slide 18 text

Let it crash Actor A Actor B mail box mail box send message

Slide 19

Slide 19 text

Let it crash Actor A Actor B mail box mail box fetch message

Slide 20

Slide 20 text

Let it crash Actor A Actor B mail box mail box process message

Slide 21

Slide 21 text

Let it crash Actor A Actor B mail box mail box send messages

Slide 22

Slide 22 text

Let it crash Actor A Actor B mail box mail box fetch and process messages

Slide 23

Slide 23 text

Let it crash Actor A Actor B mail box drunk exception! mail box

Slide 24

Slide 24 text

Let it crash Actor A Actor B mail box インスタンスを破棄 mail box

Slide 25

Slide 25 text

Let it crash Actor A mail box mail box

Slide 26

Slide 26 text

Let it crash Actor A mail box mail box Actor B インスタンス再作成

Slide 27

Slide 27 text

Let it crash Actor A Actor B mail box mail box fetch and process messages

Slide 28

Slide 28 text

supervisor tree • Actorは(基本的には)Actorによっ て作られる • 作ったActorは作られたActorを監 視する。 • 監視の木構造が出来上がる

Slide 29

Slide 29 text

supervisor tree • 監視されてるActorで上がった例外は監 視してるActorが捕捉できる • デフォルトかつ典型的動きとしては、さっ き見たようにアクターを再起動する • その他に、止めちゃったり、さらに上の 監視者に丸投げしたりできる

Slide 30

Slide 30 text

第三部 Akka で Actor

Slide 31

Slide 31 text

Actor in Scala • Akka • 信頼と実績のTypesafe製 • JVM上で動く • Java/Scalaで使えるよ • クラスタリングできるよ • 要するにJVMで動くErlang/OTPみたい なかんじ!

Slide 32

Slide 32 text

ライブコーディング & デモします

Slide 33

Slide 33 text

Akka vs Erlang • Akka • JVMの資産が使える • 文法がきもくない • Erlang • ホットデプロイできる • ErlangVM 軽量プロセス

Slide 34

Slide 34 text

まとめ • データを共有するのが辛い => Actor モデルで shared nothing! • 例外のハンドリングが辛い => Actor モデルで let it crash!

Slide 35

Slide 35 text

さらなる学習へのポインタ • https://gist.github.com/ Shinpeim/ ef7ce82595cb96ef4aa6 • http://akka.io/