Slide 1

Slide 1 text

The tale of kuiperbelt …and Perl. ٢঵ࣉ.pm11 2017-07-13 macopy a.k.a @mackee_w

Slide 2

Slide 2 text

Yokohama.pmͷ ΄͏͔Βདྷɾɾɾ

Slide 3

Slide 3 text

(๭໘നͳͷͰຊ೔͸ຊ౰ʹ) ח૔͔Βདྷ·ͨ͠

Slide 4

Slide 4 text

YAPC::Fukuoka 2017 HAKATA

Slide 5

Slide 5 text

༧ఆͰ͸όʔδϣϯݻఆͨ͠ CPANϞδϡʔϧͱͦͷཧ༝ Έ͍ͨͳ࿩Λ͢Δ༧ఆͰͨ͠ ͕ফۃతͰ໘ന͘ແͦ͞͏ͳ ͷͰkuiperbeltͷ࿩Λ͠·͢

Slide 6

Slide 6 text

kuiperbeltͱ͸ github.com/mackee/kuiperbelt

Slide 7

Slide 7 text

݁ہͳΜ΍ͶΜ

Slide 8

Slide 8 text

WebSocketͱHTTP1.1ͷ ૬ޓม׵ϓϩΩγαʔό

Slide 9

Slide 9 text

kuiperbeltͷ໾ׂ • WebSocketͷίωΫγϣϯͷҡ࣋ • ΞϓϦέʔγϣϯαʔό͕ӬଓతίωΫγϣ ϯΛ࣋ͭ͜ͱͷݞ୅ΘΓΛ͢Δ • ӬଓతίωΫγϣϯͷෛՙ෼ࢄ • ΑΓݫີʹݴ͑͹ෛՙ෼ࢄͷ࢓૊Έ

Slide 10

Slide 10 text

kuiperbeltͷ࠾༻ྫ • ࠓͷͱ͜Ζݴ͑Δ΍͕ͭͳ͍ • ͔ࣾ͠͠಺Ͱݕ౼ٴͼݕূ͸ਐΜͰ͍Δͱͩ ͚ਃ͋͛͠·͢ɻࠓͷͱ͜Ζ࢖͑ͯͦ͏

Slide 11

Slide 11 text

ͱ͜ΖͰkuiperbeltͬͯGoͩΑͶ

Slide 12

Slide 12 text

kuiperbelt loves Perl

Slide 13

Slide 13 text

kuiperbelt loves Perl5(like languages) • kuiperbelt͸͋͘·ͰσʔϞϯɻԿͰॻ͔Ε͍ͯΔ͔ҙ ࣝ͢Δ͜ͱ͸ͳ͍ • ΠϯλʔϑΣΠε͸HTTP APIɻcurlͰ΋ͳΜͰ΋ୟ͚Δ ͠ड͚ΒΕΔɻυΩϡϝϯτͰ͸netcatΛ࢖͍ͬͯΔ • Perl5੡WebAppͷऑ఺Λิ͏ͨΊʹੜ·Εͨͷ͕ kuiperbelt

Slide 14

Slide 14 text

Perl5੡WebAppͷऑ఺ͱ͸ʁ kuiperbeltͷੜ·ΕͨॠؒΛͨͲΔ

Slide 15

Slide 15 text

࡞Ζ͏ͱࢥͬͨ௚લ͸ ۭલͷAnyEventϚΠϒʔϜ • Mishima.pm#01ͰAnyEventͱ͔δϣϒΩϡʔ ͷ࿩Ͱ੝Γ্͕Δ • Hachioji.pmͰYanchaͱ͍͏νϟοτΞϓϦͷ ։ൃ͕ਐΜͰ͍ͨ(AnyEventͰWebSocketΛ ड͚Δߏ੒ͩͬͨ)

Slide 16

Slide 16 text

Perl5ͰWebSocketΛड͚Δʹ͸ • Net::WebSocket, Mojo::WebSocket… • ΠϕϯτۦಈϥΠϒϥϦ • TwiggyͳͲΛ࢖ͬͯҰͭͷϓϩηεͰෳ਺ ͷ઀ଓΛ࣋ͯΔ

Slide 17

Slide 17 text

ΠϕϯτۦಈͷσϝϦοτ • ϒϩοΩϯάಈ࡞Λߦ͏ॲཧ͕ॻ͚ͳ͍ • ී௨ʹDBI࢖͏ͱ͔(τϥϯβΫγϣϯͱ͔) • ී௨ʹϑΝΠϧIO࢖͏ͱ͔ • ී௨ʹAPIϦΫΤετ͢Δͱ͔ • શ͕ͯίʔϧόοΫܗࣜͰॻ͘Α͏ʹͳΔ

Slide 18

Slide 18 text

Q: ԿނAnyEvent͕ඞཁ͔ʁ ↓
 A: Ұͭͷϓϩηε͕ෳ਺ͷ઀ ଓΛ࣋ͯͳ͍ͱ΍ͬͯΒΕͳ ͍(C10k Problem)

Slide 19

Slide 19 text

ී௨ͷPreforkϞσϧͳ WebAppΛॻ͖ͭͭ ͪΐͬ͜ͱ͚ͩWebSocketʹ Ͱ͖ͳ͍͔

Slide 20

Slide 20 text

WebSocketͷ઀ଓΛ࣋ͭ෦෼ ͚ͩʮ୭͔ʯʹ΍ͬͯ΋Β͑ Ε͹͍͍ͷͰ͸ͳ͍͔ʁ ͦͷਓͱ͸HTTPͰ͠Ό΂Ε͹ ී௨ʹPerlͰϦΞϧλΠϜΞ ϓϦ͕ॻ͚Δ

Slide 21

Slide 21 text

͓खܰʹϚϧνεϨουΛॻ ͚Δݴޠͱͯ͠GoΛ࠾༻

Slide 22

Slide 22 text

2014-06-21

Slide 23

Slide 23 text

͔͜͠͠ͷͱ͖͸WebSocket ೉ͦ͠͏ͩͬͨͷͰ Server Sent Eventతͳϓϩτ ίϧͰ࣮૷

Slide 24

Slide 24 text

2015-10-21
 WebSocketͰશ໘తʹॻ͖௚͢

Slide 25

Slide 25 text

2015-10-21
 WebSocketͰશ໘తʹॻ͖௚͢ ࣮͸Perlͷίʔυ͕͋Γ·͢

Slide 26

Slide 26 text

“sample psgi app” • ϑϩʔͳͲΛఆٛͯ͠Έͨ΋ͷͷ࣮ࡍͷΞϓ Ϧॻ͍ͯΈͳ͍ͱ͜ΕͰ͍͚Δ͔෼͔ΒΜͳ ͱͳͬͨ • ୈҰݴޠ͕PerlͳͷͰϖϥΠνPSGIͰνϟο τΞϓϦΛॻ͍ͯΈͯػೳ͢Δ͔Λॻ͍ͯΈ ͨ

Slide 27

Slide 27 text

ͦͷޙ • ࣾ಺Ͱʮ࢖ͬͯ͘ΕʙʯͬͯԿճ͔ϓϨθϯ͢ Δ • ࣮ࡍʹݕ౼͕࢝·ΓಋೖΞϓϦͷϑΟʔυόο ΫΛड͚ΔܗͰػೳ௥Ճ • strict broadcast • application/octet-stream

Slide 28

Slide 28 text

ͦͷޙ • fujiwara͞ΜʹϕϯνϚʔΫॻ͍ͯ΋Βͬͯ νϡʔχϯάͯ͠΋Β͏ • ͦΕΛݟͯଞͷϓϩδΣΫτͰಋೖݕ౼͕޿ ͕Δ

Slide 29

Slide 29 text

ࢥ૝1 -> ౔؅ʹప͢Δ

Slide 30

Slide 30 text

ʮ͍ΒΜ͜ͱ͸͠ͳ͍ʯϝιου • ͋͘·Ͱʮ઀ଓ؅ཧʯʮϝοηʔδ഑৴ʯʹప ͢Δ • ϝοηʔδͷத਎͸ಡ·ͳ͍ • ೉͍͜͠ͱΛ΍Βͳ͍ • ͜͏ͳͬͨΒ͜͏ͳΔΈ͍ͨͳͷ͕૝૾͠΍ ͍͢࢓૊Έ

Slide 31

Slide 31 text

ࢥ૝2 -> Կ͔ʹґଘ͠ͳ͍

Slide 32

Slide 32 text

stretcher͔Βͷֶͼ • fujiwara͞ΜͷpullܕσϓϩΠπʔϧstretcher ʹ͓͍ͯσϓϩΠΛ఻͑Δ܅ͱtarballΛஔ͘ ͱ͜Ζ͸࣮͸ͳΜͰ΋ྑ͍ • Α͘consulͱS3͕࢖ΘΕΔ͕ઐ༻Ͱ͸ͳ͍

Slide 33

Slide 33 text

kuiperbeltͷྫ • ෳ਺୆ͷkuiperbeltΛ࢖͏৔߹ɺͲͷ kuiperbelt͕ಛఆͷ઀ଓΛ͍࣋ͬͯΔ͔͸઀ଓ ͞Εͨ࣌ʹϔομʹIPΞυϨεΛೖΕͯ఻͑ͯ ͘Δ • Α͘Redisʹ֨ೲ͍ͯ͠Δ͕memcachedͰ ΋RDBͰ΋ͳΜͰ΋ྑ͍

Slide 34

Slide 34 text

୭͕ԿΛ͍࣋ͬͯΔ͔ΛΫϥΠΞ ϯτ͕൑அ͢ΔγϟʔσΟϯά • ketamaͳͲͷconsistent hashingΛ༻͍ͨ memcachedͷsharding͔Βண૝ • ͔͠͠kuiperbelt͸खલʹLBΛஔ͘લఏͳͷ ͰͲ͜ͷkuiperbeltʹͭͳ͛Δ͔Λ੍ޚ͸Ͱ͖ ͳ͍ -> ܨ͕ͬͨ࣌ʹWebAppଆʹ఻͑Δ

Slide 35

Slide 35 text

ӬଓతίωΫγϣϯΛΞϓϦΛ ෼཭͢ΔࣄʹΑΔԸܙ • ΞϓϦ͕ӬଓతίωΫγϣϯΛ࣋ͭͱߋ৽࣌ͳͲͰίωΫγϣ ϯ͕੾ΕΔ • ࠶઀ଓͰҰؾʹෛՙ͕͔͔ͬͨΓετϨε͕ཷ·ͬͨΓ͢ Δ • ͋·ΓϩδοΫΛ࣋ͨͣߋ৽Λ͢Δඞཁ͕ͳ͍αʔό͕ίωΫ γϣϯΛ࣋ͭ͜ͱͰΞϓϦߋ৽࣌ʹ੾அ͕ى͜Βͳ͘ͳΔ • ͱ͍͏Θ͚ͰGoͷϓϩδΣΫτͰ΋࠾༻͞ΕΔΑ͏ʹͳΓ ·ͨ͠

Slide 36

Slide 36 text

૝૾͠΍͍͢࢓૊Έ ґଘΛۃྗͳ͘͢͜ͱͰ ࢖ΘΕ΍͘͢͢Δ

Slide 37

Slide 37 text

ͦΜͳ͜ΜͳͰ

Slide 38

Slide 38 text

·ͱΊ • kuiperbeltͱ͍͏WebSocketΛҡ࣋ͯ͘͠ΕΔσʔϞϯΛ ॻ͍͍ͯ·͢ • kuiperbelt͸Perl5 loveͰ͢ɻผʹޙΖ͸ͳΜͰ΋͍͍͚Ε Ͳ࡞ऀతʹ͸Perl5ͷͨΊʹॻ͔Ε͍ͯ·͢ • Ұ෦͚ͩ೉͍͠ͱ͜ΖΛ੾Γग़͢ͷΧοίΠΠ • ࢖ͬͯײ૝Λฉ͔ͤͯ͘Εʂʂɹ೔ຊޠυΩϡϝϯτ΋ॻ ͍ͨͧʂʂʂɹཔΉʂʂʂʂʂ