社内勉強会でアクターとアクターを使ったアプリケーションのアーキテクチャについて紹介した資料です
ΞΫλʔʹΑΔ ฒߦॲཧΞϓέʔγϣϯΞʔΩςΫνϟhakobe9321
View Slide
͢͜ͱ•ฒߦॲཧʹ͍͓ͭͯ͞Β͍•ΞΫλʔͷհ•ErlangʹΑΔΞϓϦέʔγϣϯ ΞʔΩςΫνϟ
The Free Lunch Is OverϋʔυΣΞਐԽΛ ͯγεςϜੑೳ͕ ্͢Δ࣌ऴΘͬͨ (2005ʹ)IUUQXXXHPUXDBQVCMJDBUJPOTDPODVSSFODZEEKIUNϚϧνίΞCPUͷ࣌
ϚϧνίΞCPUΛੜ͔ͤΔ ฒߦॲཧϓϩάϥϛϯάٕज़Λֶ΅͏!
AppΤϯδχΞʹؔͳ͍?Q:WebΞϓϦέʔγϣϯͷੑೳ جຊతʹIOόϯυ͡ΌΜ?A:ϨΠςϯγʹؔͯ͠ɻ େྔͷλεΫΛ࣌͘͞ͷεϧʔϓοτ͕͕ͪ͏ɻগͳ͍αʔόͰͨ͘͞Μࣄ͕Ͱ͖͓ͯಘ
ϚϧνίΞCPUΛ׆༻•୯Ґ࣌ؒʹ͔͞ͳ͍ͱ͍͚ͳ͍ σʔλ૿͍͑ͯΔ• ϒϩά/ϒοΫϚʔΫͷϦΫΤετ• Mackerelͷσʔλͷϙετ•ࠓ͋ΔΈͰ͖͖͞Εͳ͘ͳͬͨΒ??• ࣗͰ࡞Δͱ͍͏બࢶΛ࣋ͭ
ฒߦॲཧ͓͞Β͍
ϓϩηεʹΑΔฒߦॲཧ•ॲཧʹରԠ͢ΔϓϩηεΛىಈ(fork)͠OSʹεέδϡʔϧͤ͞ΔGood• ҆શ• ϓϩάϥϛϯάύϥμΠϜ͕มΘΒͳ͍Bad• ϝϞϦ/CPUΛ͏• σʔλڞ༗͕େม(File, Pipe, Socket, DB)
εϨουʹΑΔฒߦॲཧ•ҰͭͷϓϩηεͰෳͷ࣮ߦ୯ҐGood• ൺֱతϦιʔεΛΘͳ͍• ϝϞϦϑΝΠϧϋϯυϧͳͲΛ ڞ༗Ͱ͖ΔBad• ҆શʹڞ༗ϦιʔεΛ͏ͷ͕͍͠
εϨουΛ҆શʹ͏ʹ•εςʔτϨεʹ͢Δ•ڞ༗ϝϞϦͷΞΫηεΛಉظԽ͢Δ• Lock/Mutex/Semaphore/synchronized/volatile …ͨͩ͠ਖ਼͘͠͏ͷ͍͠ σουϩοΫ! σʔλڝ߹!!
ྫ: σουϩοΫ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Λ ϩοΫ͍ͨ͠ӬԕʹͭӬԕʹͭ
ฒߦॲཧͷநԽ•εϨουηʔϑͳΦϒδΣΫτʹ நԽ͢Δ•͍͠ॲཧΛ҆શʹͱΓ͔͋ͭ͑Δ ෦ͱ͖ͯ͠ΓΘ͚Δ•ྫ: Future•ࢀߟ: Javaฒߦॲཧϓϩάϥϛϯά
IUUQTQSBZJPEVTF
ΞΫλʔ
ΞΫλʔ•εϨουͷΑ͏ͳฒߦॲཧͷ୯Ґ•ϝοηʔδͷૹड৴ʹΑͬͯڠௐ•ΞΫλʔؒͰϝϞϦΛڞ༗͠ͳ͍ ˠ ڝ߹σουϩοΫ͕ى͖ʹ͍͘
ΞΫλʔ͕Ͱ͖Δ͜ͱ1.ϝοηʔδΛผͷΞΫλʔʹૹ৴͢Δ2.ผͷΞΫλʔΛ࡞Δ3.ϝοηʔδΛड৴ͯࣗ͠ͷঢ়ଶΛ มߋ͢Δ
ϝοηʔδͷૹड৴ActorϝʔϧϘοΫεϝοηʔδঢ়ଶͷߋ৽Actor
৽͍͠ΞΫλʔͷੜActorActor Actor Actorੜ ੜੜ
ΞΫλʔʹΑΔγεςϜActorActorActor Actor ActorActor
•ΞΫλʔΛߴʹେྔʹੜͰ͖Δ•ΞΫλʔΛίϯτϩʔϧ͢ΔΈ•ΞϓϦέʔγϣϯͱͯ͠ಈ࡞ͤ͞Δ ΈΞΫλʔʹΑΔ ࣮༻తͳΞϓϦέʔγϣϯߏஙErlangͷྫͰ۩ମతʹհ →
Erlangʹ͍ͭͯগ͠•ؔܕ, ಈతܕ, มͷ࠶ೖෆՄ•ΞΫλʔத৺ͷΞʔΩςΫνϟ•༗໊ͳΞϓϦέʔγϣϯྫ:• RabbitMQ, Riak, CouchDB, ిͷަػ
Erlang༻ޠͰΞΫλʔͷ͜ͱΛϓϩηεͱݺͼ·͢!!!͕ͱ͜͜ͰΞΫλʔͱ͍͏͜ͱͰʜ
ErlangͷΞΫλʔ•ErlangϓϩάϥϜΞΫλʔͷू߹•ඇৗʹܰྔͰߴ• 1ͭ300ϫʔυ• ୯७ͳͷͰ͘͢ىಈͰ͖Δ• ࢀߟ: http://d.hatena.ne.jp/sakaia/20150315#1426406872•ωΠςΟϒεϨουͰͳ͘ άϦʔϯεϨουతʹಈ࡞
spawn !!Pid = spawn(fun() ->receive hello ->io:format("Hello, World!~n")endend).Pid ! hello.ActorActor ActorActorActor ActorhelloHello, World!
ΞΫλʔͷίϯτϩʔϧ•Ұ෦ͷΞΫλʔ͕Τϥʔ͕͓͖ͨΒ?ActorActorActor Actor ActorActorError!!
Let it crash•Τϥʔ͕͓͖ΔͱΞΫλʔ͕Ϋϥογϡ!ActorActorActor Actor ActorActorγεςϜͷଞͷ෦Ͳ͏͢Δ?
LinkActor ActorActor ActorActor Actor-JOLҰํ͕ऴྃࣗಈతʹ ͏ҰํऴྃγεςϜશମΛ࣮֬ʹऴྃͰ͖Δ
Link + process_trapActor ActorActor ActorActor Actor-JOLҰํ͕ऴྃ&9*5 ͕ૹ৴͞ΕΔ &9*5
•ऴྃϋϯυϧͰ͖ΔLink + process_trapActor ActorޙॲཧΛ͢ΔActorActor࠶ىಈ͢Δ Actor͋Δ͍Monitorͱ͍͏Έ͋Δ
Ͳ͏͍͏ઓུͰΤϥʔॲཧ͢Δ͔?•࣮͜ΕWorkerManagerͰͨ͠ServerWorker Worker WorkerManagerMainશମΛཧϦΫΤετ ड͚͚ϫʔΧʔΛ ཧ
Worker͕ΤϥʔServerWorker Worker WorkerManagerMain→Worker͚ͩ࠶ىಈ͢ΕΑ͍
Server͕ΤϥʔServerWorker Worker WorkerManagerMain→ܑఋͱͦͷࢠ͋Θͤͯ࠶ىಈ
Supervisorʹ·͔ͤΑ͏•ΞΫλʔऴྃॲཧʹύλʔϯ͕͋Δ•Link(Monitor)Λͬͯஸೡʹ࣮ ͢Δͷୀ۶•Α͋͘ΔཧॲཧΛݞΘΓͯ͘͠ΕΔͷ͕Supervisor
࠶ىಈͷઓུ•࠶ىಈ͢Δ͔Ͳ͏͔?• permanent/temporary/transient•ԿΛ࠶ىಈ͢Δ͔?• one_for_one/one_for_all/one_for_rest•ͲΕ͘Β͍Ͱ͖͋ΒΊΔ͔?• nҎʹmճ࠶ىಈͨ͠Βࢮ͵
ManagerͷઓུServerWorker Worker WorkerManagerMain permanent, one_for_one
MainͷઓུServerWorker Worker WorkerManagerMain permanent one_for_all
•SupervisorπϦʔ͕ ΞϓϦέʔγϣϯΛߏ͢ΔErlangͷΞϓϦέʔγϣϯApplication
RabbitMQͷSupervisorπϦʔIUUQXXXTMJEFTIBSFOFUPME@TPVOEEJTTFDUJOHUIFSBCCJU
SupervisorʹΑΔো ΞʔΩςΫνϟ•ΤϥʔͷॏཁʹԠͯ͡ΞΫλʔΛׂ•Τϥʔ࣌ͷΞΫλʔͷઓུΛSupervisorʹΑΓઃఆ• దͳൣғΛඞཁʹԠͯ͡࠶ىಈ• Τϥʔͷ͜ͱΛߟ͑ͳ͍ͱ͍͚ͳ͍ઃܭ
·ͱΊ•ΞΫλʔ҆શͰॊೈͳ ฒߦॲཧϓϩάϥϛϯάٕज़ͷͻͱͭ•ErlangΞΫλʔʹΑΔγεςϜͷ ࣮༻తͳϓϥοτϑΥʔϜ•SupervisorΛ༻͍ͨোੑ ΞʔΩςΫνϟ͕ߏஙͰ͖Δκ
ࢀߟจݙ•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