$30 off During Our Annual Pro Sale. View Details »

アクターによる
並行処理アプケーション アーキテクチャ

アクターによる
並行処理アプケーション アーキテクチャ

社内勉強会でアクターとアクターを使ったアプリケーションのアーキテクチャについて紹介した資料です

hakobe (Yohei Fushii)

November 27, 2015
Tweet

More Decks by hakobe (Yohei Fushii)

Other Decks in Programming

Transcript

  1. ΞΫλʔʹΑΔ

    ฒߦॲཧΞϓέʔγϣϯ
    ΞʔΩςΫνϟ
    hakobe932
    1

    View Slide

  2. ࿩͢͜ͱ
    •ฒߦॲཧʹ͍͓ͭͯ͞Β͍
    •ΞΫλʔͷ঺հ
    •ErlangʹΑΔΞϓϦέʔγϣϯ

    ΞʔΩςΫνϟ

    View Slide

  3. The Free Lunch Is Over

    ϋʔυ΢ΣΞਐԽΛ

    ଴ͯ͹γεςϜੑೳ͕

    ޲্͢Δ࣌୅͸ऴΘͬͨ

    (2005೥ʹ)
    IUUQXXXHPUXDBQVCMJDBUJPOTDPODVSSFODZEEKIUN
    ϚϧνίΞCPUͷ࣌୅

    View Slide

  4. ϚϧνίΞCPUΛੜ͔ͤΔ

    ฒߦॲཧϓϩάϥϛϯάٕज़Λ
    ֶ΅͏!

    View Slide

  5. AppΤϯδχΞʹؔ܎ͳ͍?
    Q:WebΞϓϦέʔγϣϯͷੑೳ͸

    جຊతʹ͸IOό΢ϯυ͡ΌΜ?
    A:ϨΠςϯγʹؔͯ͠͸ɻ

    େྔͷλεΫΛ͞͹࣌͘ͷεϧʔϓοτ
    ͕͕ͪ͏ɻ

    গͳ͍αʔόͰͨ͘͞Μ࢓ࣄ͕Ͱ͖͓ͯಘ

    View Slide

  6. ϚϧνίΞCPUΛ׆༻
    •୯Ґ࣌ؒʹ͞͹͔ͳ͍ͱ͍͚ͳ͍

    σʔλ͸૿͍͑ͯΔ
    • ϒϩά/ϒοΫϚʔΫ΁ͷϦΫΤετ
    • Mackerel΁ͷσʔλͷϙετ
    •ࠓ͋Δ࢓૊ΈͰ͸͞͹͖͖Εͳ͘ͳͬ
    ͨΒ??
    • ࣗ෼Ͱ࡞Δͱ͍͏બ୒ࢶΛ࣋ͭ

    View Slide

  7. ฒߦॲཧ͓͞Β͍

    View Slide

  8. ϓϩηεʹΑΔฒߦॲཧ
    •ॲཧʹରԠ͢ΔϓϩηεΛىಈ(fork)
    ͠OSʹεέδϡʔϧͤ͞Δ
    Good
    • ҆શ
    • ϓϩάϥϛϯάύϥμΠϜ͕มΘΒͳ͍
    Bad
    • ϝϞϦ/CPUΛ࢖͏
    • σʔλڞ༗͕େม(File, Pipe, Socket, DB)

    View Slide

  9. εϨουʹΑΔฒߦॲཧ
    •Ұͭͷϓϩηε಺Ͱෳ਺ͷ࣮ߦ୯Ґ
    Good
    • ൺֱతϦιʔεΛ࢖Θͳ͍
    • ϝϞϦ΍ϑΝΠϧϋϯυϧͳͲΛ

    ڞ༗Ͱ͖Δ
    Bad
    • ҆શʹڞ༗ϦιʔεΛ࢖͏ͷ͕೉͍͠

    View Slide

  10. εϨουΛ҆શʹ࢖͏ʹ͸
    •εςʔτϨεʹ͢Δ
    •ڞ༗ϝϞϦ΁ͷΞΫηεΛಉظԽ͢Δ
    • Lock/Mutex/Semaphore/synchronized/
    volatile …

    ͨͩ͠ਖ਼͘͠࢖͏ͷ͸೉͍͠

    σουϩοΫ! σʔλڝ߹!!

    View Slide

  11. ྫ: σουϩοΫ

    public class LeftRightDeadlock {
    private final Object left = new Object();
    private final Object right = new Object();
    public void leftRight() {
    synchronized (left) {
    synchronized (right) {
    doSomething();
    }
    }
    }
    public void rightLeft() {
    synchronized (right) {
    synchronized (left) {
    doSomething();
    }
    }
    }
    }
    " #
    leftΛ

    ϩοΫ
    rightΛ

    ϩοΫ
    rightΛ

    ϩοΫ͍ͨ͠
    leftΛ

    ϩοΫ͍ͨ͠
    Ӭԕʹ଴ͭ
    Ӭԕʹ଴ͭ

    View Slide

  12. ฒߦॲཧͷந৅Խ

    •εϨουηʔϑͳΦϒδΣΫτʹ

    ந৅Խ͢Δ
    •೉͍͠ॲཧΛ҆શʹͱΓ͔͋ͭ͑Δ

    ෦඼ͱ͖ͯ͠ΓΘ͚Δ
    •ྫ: Future
    •ࢀߟ: Javaฒߦॲཧϓϩάϥϛϯά

    View Slide


  13. IUUQTQSBZJPEVTF

    View Slide

  14. ΞΫλʔ

    View Slide

  15. ΞΫλʔ
    •εϨουͷΑ͏ͳฒߦॲཧͷ୯Ґ
    •ϝοηʔδͷૹड৴ʹΑͬͯڠௐ
    •ΞΫλʔؒͰϝϞϦΛڞ༗͠ͳ͍

    ˠ ڝ߹΍σουϩοΫ͕ى͖ʹ͍͘

    View Slide

  16. ΞΫλʔ͕Ͱ͖Δ͜ͱ
    1.ϝοηʔδΛผͷΞΫλʔʹૹ৴͢Δ
    2.ผͷΞΫλʔΛ࡞Δ
    3.ϝοηʔδΛड৴ͯࣗ͠෼ͷঢ়ଶΛ

    มߋ͢Δ

    View Slide

  17. ϝοηʔδͷૹड৴

    Actor
    ϝʔϧϘοΫε
    ϝοηʔδ
    ঢ়ଶͷߋ৽
    Actor

    View Slide

  18. ৽͍͠ΞΫλʔͷੜ੒

    Actor
    Actor Actor Actor
    ੜ੒ ੜ੒
    ੜ੒

    View Slide

  19. ΞΫλʔʹΑΔγεςϜ

    Actor
    Actor
    Actor Actor Actor
    Actor

    View Slide

  20. •ΞΫλʔΛߴ଎ʹେྔʹੜ੒Ͱ͖Δ
    •ΞΫλʔΛίϯτϩʔϧ͢Δ࢓૊Έ
    •ΞϓϦέʔγϣϯͱͯ͠ಈ࡞ͤ͞Δ

    ࢓૊Έ
    ΞΫλʔʹΑΔ

    ࣮༻తͳΞϓϦέʔγϣϯߏங

    ErlangͷྫͰ۩ମతʹ঺հ →

    View Slide

  21. Erlangʹ͍ͭͯগ͠
    •ؔ਺ܕ, ಈతܕ෇, ม਺΁ͷ࠶୅ೖෆՄ
    •ΞΫλʔத৺ͷΞʔΩςΫνϟ
    •༗໊ͳΞϓϦέʔγϣϯྫ:
    • RabbitMQ, Riak,

    CouchDB, ి࿩ͷަ׵ػ

    View Slide

  22. Erlang༻ޠͰ͸ΞΫλʔͷ͜
    ͱΛϓϩηεͱݺͼ·͢!!!
    ͕ͱ͜͜Ͱ͸ΞΫλʔͱ͍͏͜ͱͰʜ

    View Slide

  23. ErlangͷΞΫλʔ
    •ErlangϓϩάϥϜ͸ΞΫλʔͷू߹
    •ඇৗʹܰྔͰߴ଎
    • 1ͭ300ϫʔυ
    • ୯७ͳͷͰ͢͹΍͘ىಈͰ͖Δ
    • ࢀߟ: http://d.hatena.ne.jp/sakaia/
    20150315#1426406872
    •ωΠςΟϒεϨουͰ͸ͳ͘

    άϦʔϯεϨουతʹಈ࡞

    View Slide

  24. spawn !!

    Pid = spawn(fun() ->
    receive hello ->
    io:format("Hello, World!~n")
    end
    end).
    Pid ! hello.
    Actor
    Actor Actor
    Actor
    Actor Actor
    hello
    Hello,

    World!

    View Slide

  25. ΞΫλʔͷίϯτϩʔϧ
    •Ұ෦ͷΞΫλʔ͕Τϥʔ͕͓͖ͨΒ?

    Actor
    Actor
    Actor Actor Actor
    Actor
    Error!!

    View Slide

  26. Let it crash
    •Τϥʔ͕͓͖ΔͱΞΫλʔ͕Ϋϥογϡ!

    Actor
    Actor
    Actor Actor Actor
    Actor
    γεςϜͷଞͷ෦෼͸Ͳ͏͢Δ?

    View Slide

  27. Link

    Actor Actor
    Actor Actor
    Actor Actor
    -JOL
    Ұํ͕ऴྃ
    ࣗಈతʹ

    ΋͏Ұํ΋ऴྃ
    γεςϜશମΛ࣮֬ʹऴྃͰ͖Δ

    View Slide

  28. Link + process_trap

    Actor Actor
    Actor Actor
    Actor Actor
    -JOL
    Ұํ͕ऴྃ
    &9*5

    ͕ૹ৴͞ΕΔ &9*5

    View Slide

  29. •ऴྃϋϯυϧͰ͖Δ
    Link + process_trap

    Actor Actor
    ޙॲཧΛ͢Δ
    Actor
    Actor
    ࠶ىಈ͢Δ Actor
    ͋Δ͍͸
    Monitorͱ͍͏࢓૊Έ΋͋Δ

    View Slide

  30. Ͳ͏͍͏ઓུͰΤϥʔॲཧ͢Δ͔?
    •࣮͸͜Ε͸WorkerManagerͰͨ͠

    Server
    Worker Worker Worker
    Manager
    Main
    શମΛ؅ཧ
    ϦΫΤετ

    ड͚෇͚
    ϫʔΧʔΛ

    ؅ཧ

    View Slide

  31. Worker͕Τϥʔ

    Server
    Worker Worker Worker
    Manager
    Main
    →Worker͚ͩ࠶ىಈ͢Ε͹Α͍

    View Slide

  32. Server͕Τϥʔ

    Server
    Worker Worker Worker
    Manager
    Main
    →ܑఋͱͦͷࢠ΋͋Θͤͯ࠶ىಈ

    View Slide

  33. Supervisorʹ·͔ͤΑ͏
    •ΞΫλʔऴྃॲཧʹ͸ύλʔϯ͕͋Δ
    •Link(΍Monitor)Λ࢖ͬͯஸೡʹ࣮૷

    ͢Δͷ͸ୀ۶
    •Α͋͘Δ؅ཧॲཧΛݞ୅ΘΓͯ͘͠Ε
    Δͷ͕Supervisor

    View Slide

  34. ࠶ىಈͷઓུ
    •࠶ىಈ͢Δ͔Ͳ͏͔?
    • permanent/temporary/transient
    •ԿΛ࠶ىಈ͢Δ͔?
    • one_for_one/one_for_all/one_for_rest
    •ͲΕ͘Β͍Ͱ͖͋ΒΊΔ͔?
    • n෼Ҏ಺ʹmճ࠶ىಈͨ͠Βࢮ͵

    View Slide

  35. Managerͷઓུ

    Server
    Worker Worker Worker
    Manager
    Main permanent,

    one_for_one

    View Slide

  36. Mainͷઓུ

    Server
    Worker Worker Worker
    Manager
    Main permanent

    one_for_all

    View Slide

  37. •SupervisorπϦʔ͕

    ΞϓϦέʔγϣϯΛߏ੒͢Δ
    ErlangͷΞϓϦέʔγϣϯ

    Application

    View Slide

  38. RabbitMQͷSupervisorπϦʔ
    IUUQXXXTMJEFTIBSFOFUPME@TPVOEEJTTFDUJOHUIFSBCCJU

    View Slide

  39. SupervisorʹΑΔ଱ো֐

    ΞʔΩςΫνϟ
    •Τϥʔͷॏཁ౓ʹԠͯ͡ΞΫλʔΛ෼ׂ
    •Τϥʔ࣌ͷΞΫλʔͷઓུΛSupervisor
    ʹΑΓઃఆ
    • ద੾ͳൣғΛඞཁʹԠͯ͡࠶ىಈ
    • Τϥʔͷ͜ͱΛߟ͑ͳ͍ͱ͍͚ͳ͍ઃܭ

    View Slide

  40. ·ͱΊ

    •ΞΫλʔ͸҆શͰॊೈͳ

    ฒߦॲཧϓϩάϥϛϯάٕज़ͷͻͱͭ
    •Erlang͸ΞΫλʔʹΑΔγεςϜͷ

    ࣮༻తͳϓϥοτϑΥʔϜ
    •SupervisorΛ༻͍ͨ଱ো֐ੑ

    ΞʔΩςΫνϟ͕ߏஙͰ͖Δκ

    View Slide

  41. ࢀߟจݙ

    •Javaฒߦॲཧϓϩάϥϛϯά
    - http://www.amazon.co.jp/dp/4797337206
    •͍͢͝ErlangΏ͔͍ʹֶ΅͏ʂ
    - http://www.amazon.co.jp/dp/B00MLUGZIS/
    •ฒߦॲཧॳ৺ऀͷͨΊͷAkkaೖ໳
    - http://www.slideshare.net/sifue/akka-39611889
    •ϓϩάϥϛϯάݴޠͷύϥμΠϜγϑτʔScala͔ΒݟΔؔ਺ܕͱฒ
    ྻੑ࣌୅ͷນ։͚
    - http://www.slideshare.net/TanUkkii/functional-and-
    concurencyinscala
    •Web API αʔόʔͱͯ͠ͷ Elixir ͷՄೳੑ
    - https://speakerdeck.com/naoya/web-api-sabatositefalse-elixir-
    falseke-neng-xing

    View Slide