Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

The Free Lunch Is Over ϋʔυ΢ΣΞਐԽΛ
 ଴ͯ͹γεςϜੑೳ͕
 ޲্͢Δ࣌୅͸ऴΘͬͨ
 (2005೥ʹ) IUUQXXXHPUXDBQVCMJDBUJPOTDPODVSSFODZEEKIUN ϚϧνίΞCPUͷ࣌୅

Slide 4

Slide 4 text

ϚϧνίΞCPUΛੜ͔ͤΔ
 ฒߦॲཧϓϩάϥϛϯάٕज़Λ ֶ΅͏!

Slide 5

Slide 5 text

AppΤϯδχΞʹؔ܎ͳ͍? Q:WebΞϓϦέʔγϣϯͷੑೳ͸
 جຊతʹ͸IOό΢ϯυ͡ΌΜ? A:ϨΠςϯγʹؔͯ͠͸ɻ
 େྔͷλεΫΛ͞͹࣌͘ͷεϧʔϓοτ ͕͕ͪ͏ɻ গͳ͍αʔόͰͨ͘͞Μ࢓ࣄ͕Ͱ͖͓ͯಘ

Slide 6

Slide 6 text

ϚϧνίΞCPUΛ׆༻ •୯Ґ࣌ؒʹ͞͹͔ͳ͍ͱ͍͚ͳ͍
 σʔλ͸૿͍͑ͯΔ • ϒϩά/ϒοΫϚʔΫ΁ͷϦΫΤετ • Mackerel΁ͷσʔλͷϙετ •ࠓ͋Δ࢓૊ΈͰ͸͞͹͖͖Εͳ͘ͳͬ ͨΒ?? • ࣗ෼Ͱ࡞Δͱ͍͏બ୒ࢶΛ࣋ͭ

Slide 7

Slide 7 text

ฒߦॲཧ͓͞Β͍

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

εϨουʹΑΔฒߦॲཧ •Ұͭͷϓϩηε಺Ͱෳ਺ͷ࣮ߦ୯Ґ Good • ൺֱతϦιʔεΛ࢖Θͳ͍ • ϝϞϦ΍ϑΝΠϧϋϯυϧͳͲΛ
 ڞ༗Ͱ͖Δ Bad • ҆શʹڞ༗ϦιʔεΛ࢖͏ͷ͕೉͍͠

Slide 10

Slide 10 text

εϨουΛ҆શʹ࢖͏ʹ͸ •εςʔτϨεʹ͢Δ •ڞ༗ϝϞϦ΁ͷΞΫηεΛಉظԽ͢Δ • Lock/Mutex/Semaphore/synchronized/ volatile … ͨͩ͠ਖ਼͘͠࢖͏ͷ͸೉͍͠
 σουϩοΫ! σʔλڝ߹!!

Slide 11

Slide 11 text

ྫ: σουϩοΫ 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Λ
 ϩοΫ͍ͨ͠ Ӭԕʹ଴ͭ Ӭԕʹ଴ͭ

Slide 12

Slide 12 text

ฒߦॲཧͷந৅Խ •εϨουηʔϑͳΦϒδΣΫτʹ
 ந৅Խ͢Δ •೉͍͠ॲཧΛ҆શʹͱΓ͔͋ͭ͑Δ
 ෦඼ͱ͖ͯ͠ΓΘ͚Δ •ྫ: Future •ࢀߟ: Javaฒߦॲཧϓϩάϥϛϯά

Slide 13

Slide 13 text

IUUQTQSBZJPEVTF

Slide 14

Slide 14 text

ΞΫλʔ

Slide 15

Slide 15 text

ΞΫλʔ •εϨουͷΑ͏ͳฒߦॲཧͷ୯Ґ •ϝοηʔδͷૹड৴ʹΑͬͯڠௐ •ΞΫλʔؒͰϝϞϦΛڞ༗͠ͳ͍
 ˠ ڝ߹΍σουϩοΫ͕ى͖ʹ͍͘

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

৽͍͠ΞΫλʔͷੜ੒ Actor Actor Actor Actor ੜ੒ ੜ੒ ੜ੒

Slide 19

Slide 19 text

ΞΫλʔʹΑΔγεςϜ Actor Actor Actor Actor Actor Actor

Slide 20

Slide 20 text

•ΞΫλʔΛߴ଎ʹେྔʹੜ੒Ͱ͖Δ •ΞΫλʔΛίϯτϩʔϧ͢Δ࢓૊Έ •ΞϓϦέʔγϣϯͱͯ͠ಈ࡞ͤ͞Δ
 ࢓૊Έ ΞΫλʔʹΑΔ
 ࣮༻తͳΞϓϦέʔγϣϯߏங ErlangͷྫͰ۩ମతʹ঺հ →

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

Let it crash •Τϥʔ͕͓͖ΔͱΞΫλʔ͕Ϋϥογϡ! Actor Actor Actor Actor Actor Actor γεςϜͷଞͷ෦෼͸Ͳ͏͢Δ?

Slide 27

Slide 27 text

Link Actor Actor Actor Actor Actor Actor -JOL Ұํ͕ऴྃ ࣗಈతʹ
 ΋͏Ұํ΋ऴྃ γεςϜશମΛ࣮֬ʹऴྃͰ͖Δ

Slide 28

Slide 28 text

Link + process_trap Actor Actor Actor Actor Actor Actor -JOL Ұํ͕ऴྃ &9*5
 ͕ૹ৴͞ΕΔ &9*5

Slide 29

Slide 29 text

•ऴྃϋϯυϧͰ͖Δ Link + process_trap Actor Actor ޙॲཧΛ͢Δ Actor Actor ࠶ىಈ͢Δ Actor ͋Δ͍͸ Monitorͱ͍͏࢓૊Έ΋͋Δ

Slide 30

Slide 30 text

Ͳ͏͍͏ઓུͰΤϥʔॲཧ͢Δ͔? •࣮͸͜Ε͸WorkerManagerͰͨ͠ Server Worker Worker Worker Manager Main શମΛ؅ཧ ϦΫΤετ
 ड͚෇͚ ϫʔΧʔΛ
 ؅ཧ

Slide 31

Slide 31 text

Worker͕Τϥʔ Server Worker Worker Worker Manager Main →Worker͚ͩ࠶ىಈ͢Ε͹Α͍

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

Supervisorʹ·͔ͤΑ͏ •ΞΫλʔऴྃॲཧʹ͸ύλʔϯ͕͋Δ •Link(΍Monitor)Λ࢖ͬͯஸೡʹ࣮૷
 ͢Δͷ͸ୀ۶ •Α͋͘Δ؅ཧॲཧΛݞ୅ΘΓͯ͘͠Ε Δͷ͕Supervisor

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

Managerͷઓུ Server Worker Worker Worker Manager Main permanent,
 one_for_one

Slide 36

Slide 36 text

Mainͷઓུ Server Worker Worker Worker Manager Main permanent one_for_all

Slide 37

Slide 37 text

•SupervisorπϦʔ͕
 ΞϓϦέʔγϣϯΛߏ੒͢Δ ErlangͷΞϓϦέʔγϣϯ Application

Slide 38

Slide 38 text

RabbitMQͷSupervisorπϦʔ IUUQXXXTMJEFTIBSFOFUPME@TPVOEEJTTFDUJOHUIFSBCCJU

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

·ͱΊ •ΞΫλʔ͸҆શͰॊೈͳ
 ฒߦॲཧϓϩάϥϛϯάٕज़ͷͻͱͭ •Erlang͸ΞΫλʔʹΑΔγεςϜͷ
 ࣮༻తͳϓϥοτϑΥʔϜ •SupervisorΛ༻͍ͨ଱ো֐ੑ
 ΞʔΩςΫνϟ͕ߏஙͰ͖Δκ

Slide 41

Slide 41 text

ࢀߟจݙ •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