Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
The tale of kuiperbelt ...and Perl.
mackee
July 14, 2017
Programming
1
2.1k
The tale of kuiperbelt ...and Perl.
吉祥寺.pm11
mackee
July 14, 2017
Tweet
Share
More Decks by mackee
See All by mackee
じわじわとPerlからGoに移行しようとしている俺達のマイクロサービシーズの紹介 / The migrating to microservices in Go from Monolith in Perl
mackee
2
1.1k
Mojoliciousで書いて理解するhotwireの仕組み
mackee
0
4.1k
GraphQLサーバを作る苦しみと解決手法
mackee
16
8.6k
ChatBotの重いタスクをCircleCIに持っていってみた / How to move heavy tasks on ChatBot to CircleCI
mackee
1
3.8k
ゲームのマスタデータ特有の3つの困難と、カヤックでの解決方法 / How to solve three problems when handling the master-data of mobile games
mackee
3
10k
設計した自作キーボードの基板を中国で小ロット量産するときの 苦労、涙、理由 / How to "build" the PCB of keyboard
mackee
2
6.4k
電子基板を快適に作るためのキーボードの電子基板を作る技術 / Build my keyboard for my keyboard
mackee
0
4.5k
ゲームのサーバサイドエンジニアをやっていく技術 / The technology of game server side engineer
mackee
1
4.5k
package名と変数名がかぶっているのをとにかく検出したい / I need detect to conflicts of identifier for Go
mackee
3
6.1k
Other Decks in Programming
See All in Programming
Terraform Plan/Apply結果の自動通知
ymmy02
0
280
RFC 9111: HTTP Caching
jxck
0
160
BASE BANKチームの技術選定と歴史 / how to decide technology selection for startup
budougumi0617
0
1.1k
Baseline Profilesでアプリのパフォーマンスを向上させる / Improve app performance with Baseline Profiles
numeroanddev
0
250
Java アプリとAWS の良い関係 - AWS でJava アプリを実行する一番簡単な方法教えます / AWS for Javarista
kanamasa
2
1.2k
The strategies behind ddd – AdeoDevSummit 2022
lilobase
PRO
4
250
Gitlab CIでMRを自動生成する
forcia_dev_pr
0
110
VisualProgramming_GoogleHome_LINE
nearmugi
1
230
「混ぜるな危険」を推進する設計
minodriven
5
1.6k
Why Airflow? & What's new in Airflow 2.3?
kaxil
0
120
Get Ready for Jakarta EE 10
ivargrimstad
0
2.3k
From Java through Scala to Clojure
lagenorhynque
0
230
Featured
See All Featured
Streamline your AJAX requests with AmplifyJS and jQuery
dougneiner
127
8.5k
Thoughts on Productivity
jonyablonski
43
2.3k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
19
1.4k
Designing for Performance
lara
597
63k
Code Reviewing Like a Champion
maltzj
506
37k
Stop Working from a Prison Cell
hatefulcrawdad
261
17k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
7
1.1k
Building a Scalable Design System with Sketch
lauravandoore
448
30k
Fontdeck: Realign not Redesign
paulrobertlloyd
73
4.1k
Fireside Chat
paigeccino
12
1.3k
A Tale of Four Properties
chriscoyier
149
21k
Infographics Made Easy
chrislema
233
17k
Transcript
The tale of kuiperbelt …and Perl. ٢ࣉ.pm11 2017-07-13 macopy a.k.a
@mackee_w
Yokohama.pmͷ ΄͏͔Βདྷɾɾɾ
(໘നͳͷͰຊຊʹ) ח͔Βདྷ·ͨ͠
YAPC::Fukuoka 2017 HAKATA
༧ఆͰόʔδϣϯݻఆͨ͠ CPANϞδϡʔϧͱͦͷཧ༝ Έ͍ͨͳΛ͢Δ༧ఆͰͨ͠ ͕ফۃతͰ໘ന͘ແͦ͞͏ͳ ͷͰkuiperbeltͷΛ͠·͢
kuiperbeltͱ github.com/mackee/kuiperbelt
݁ہͳΜͶΜ
WebSocketͱHTTP1.1ͷ ૬ޓมϓϩΩγαʔό
kuiperbeltͷׂ • WebSocketͷίωΫγϣϯͷҡ࣋ • ΞϓϦέʔγϣϯαʔό͕ӬଓతίωΫγϣ ϯΛ࣋ͭ͜ͱͷݞΘΓΛ͢Δ • ӬଓతίωΫγϣϯͷෛՙࢄ • ΑΓݫີʹݴ͑ෛՙࢄͷΈ
kuiperbeltͷ࠾༻ྫ • ࠓͷͱ͜Ζݴ͑Δ͕ͭͳ͍ • ͔ࣾ͠͠Ͱݕ౼ٴͼݕূਐΜͰ͍Δͱͩ ͚ਃ͋͛͠·͢ɻࠓͷͱ͜Ζ͑ͯͦ͏
ͱ͜ΖͰkuiperbeltͬͯGoͩΑͶ
kuiperbelt loves Perl
kuiperbelt loves Perl5(like languages) • kuiperbelt͋͘·ͰσʔϞϯɻԿͰॻ͔Ε͍ͯΔ͔ҙ ࣝ͢Δ͜ͱͳ͍ • ΠϯλʔϑΣΠεHTTP APIɻcurlͰͳΜͰୟ͚Δ
͠ड͚ΒΕΔɻυΩϡϝϯτͰnetcatΛ͍ͬͯΔ • Perl5WebAppͷऑΛิ͏ͨΊʹੜ·Εͨͷ͕ kuiperbelt
Perl5WebAppͷऑͱʁ kuiperbeltͷੜ·ΕͨॠؒΛͨͲΔ
࡞Ζ͏ͱࢥͬͨલ ۭલͷAnyEventϚΠϒʔϜ • Mishima.pm#01ͰAnyEventͱ͔δϣϒΩϡʔ ͷͰΓ্͕Δ • Hachioji.pmͰYanchaͱ͍͏νϟοτΞϓϦͷ ։ൃ͕ਐΜͰ͍ͨ(AnyEventͰWebSocketΛ ड͚Δߏͩͬͨ)
Perl5ͰWebSocketΛड͚Δʹ • Net::WebSocket, Mojo::WebSocket… • ΠϕϯτۦಈϥΠϒϥϦ • TwiggyͳͲΛͬͯҰͭͷϓϩηεͰෳ ͷଓΛ࣋ͯΔ
ΠϕϯτۦಈͷσϝϦοτ • ϒϩοΩϯάಈ࡞Λߦ͏ॲཧ͕ॻ͚ͳ͍ • ී௨ʹDBI͏ͱ͔(τϥϯβΫγϣϯͱ͔) • ී௨ʹϑΝΠϧIO͏ͱ͔ • ී௨ʹAPIϦΫΤετ͢Δͱ͔ •
શ͕ͯίʔϧόοΫܗࣜͰॻ͘Α͏ʹͳΔ
Q: ԿނAnyEvent͕ඞཁ͔ʁ ↓ A: Ұͭͷϓϩηε͕ෳͷ ଓΛ࣋ͯͳ͍ͱͬͯΒΕͳ ͍(C10k Problem)
ී௨ͷPreforkϞσϧͳ WebAppΛॻ͖ͭͭ ͪΐͬ͜ͱ͚ͩWebSocketʹ Ͱ͖ͳ͍͔
WebSocketͷଓΛ࣋ͭ෦ ͚ͩʮ୭͔ʯʹͬͯΒ͑ Ε͍͍ͷͰͳ͍͔ʁ ͦͷਓͱHTTPͰ͠ΌΕ ී௨ʹPerlͰϦΞϧλΠϜΞ ϓϦ͕ॻ͚Δ
͓खܰʹϚϧνεϨουΛॻ ͚Δݴޠͱͯ͠GoΛ࠾༻
2014-06-21
͔͜͠͠ͷͱ͖WebSocket ͦ͠͏ͩͬͨͷͰ Server Sent Eventతͳϓϩτ ίϧͰ࣮
2015-10-21 WebSocketͰશ໘తʹॻ͖͢
2015-10-21 WebSocketͰશ໘తʹॻ͖͢ ࣮Perlͷίʔυ͕͋Γ·͢
“sample psgi app” • ϑϩʔͳͲΛఆٛͯ͠Έͨͷͷ࣮ࡍͷΞϓ Ϧॻ͍ͯΈͳ͍ͱ͜ΕͰ͍͚Δ͔͔ΒΜͳ ͱͳͬͨ • ୈҰݴޠ͕PerlͳͷͰϖϥΠνPSGIͰνϟο τΞϓϦΛॻ͍ͯΈͯػೳ͢Δ͔Λॻ͍ͯΈ
ͨ
ͦͷޙ • ࣾͰʮͬͯ͘ΕʙʯͬͯԿճ͔ϓϨθϯ͢ Δ • ࣮ࡍʹݕ౼͕࢝·ΓಋೖΞϓϦͷϑΟʔυόο ΫΛड͚ΔܗͰػೳՃ • strict broadcast
• application/octet-stream
ͦͷޙ • fujiwara͞ΜʹϕϯνϚʔΫॻ͍ͯΒͬͯ νϡʔχϯάͯ͠Β͏ • ͦΕΛݟͯଞͷϓϩδΣΫτͰಋೖݕ౼͕ ͕Δ
ࢥ1 -> ʹప͢Δ
ʮ͍ΒΜ͜ͱ͠ͳ͍ʯϝιου • ͋͘·Ͱʮଓཧʯʮϝοηʔδ৴ʯʹప ͢Δ • ϝοηʔδͷதಡ·ͳ͍ • ͍͜͠ͱΛΒͳ͍ • ͜͏ͳͬͨΒ͜͏ͳΔΈ͍ͨͳͷ͕૾͠
͍͢Έ
ࢥ2 -> Կ͔ʹґଘ͠ͳ͍
stretcher͔Βͷֶͼ • fujiwara͞ΜͷpullܕσϓϩΠπʔϧstretcher ʹ͓͍ͯσϓϩΠΛ͑Δ܅ͱtarballΛஔ͘ ͱ͜Ζ࣮ͳΜͰྑ͍ • Α͘consulͱS3͕ΘΕΔ͕ઐ༻Ͱͳ͍
kuiperbeltͷྫ • ෳͷkuiperbeltΛ͏߹ɺͲͷ kuiperbelt͕ಛఆͷଓΛ͍࣋ͬͯΔ͔ଓ ͞Εͨ࣌ʹϔομʹIPΞυϨεΛೖΕͯ͑ͯ ͘Δ • Α͘Redisʹ֨ೲ͍ͯ͠Δ͕memcachedͰ RDBͰͳΜͰྑ͍
୭͕ԿΛ͍࣋ͬͯΔ͔ΛΫϥΠΞ ϯτ͕அ͢ΔγϟʔσΟϯά • ketamaͳͲͷconsistent hashingΛ༻͍ͨ memcachedͷsharding͔Βண • ͔͠͠kuiperbeltखલʹLBΛஔ͘લఏͳͷ ͰͲ͜ͷkuiperbeltʹͭͳ͛Δ͔Λ੍ޚͰ͖ ͳ͍
-> ܨ͕ͬͨ࣌ʹWebAppଆʹ͑Δ
ӬଓతίωΫγϣϯΛΞϓϦΛ ͢ΔࣄʹΑΔԸܙ • ΞϓϦ͕ӬଓతίωΫγϣϯΛ࣋ͭͱߋ৽࣌ͳͲͰίωΫγϣ ϯ͕ΕΔ • ࠶ଓͰҰؾʹෛՙ͕͔͔ͬͨΓετϨε͕ཷ·ͬͨΓ͢ Δ • ͋·ΓϩδοΫΛ࣋ͨͣߋ৽Λ͢Δඞཁ͕ͳ͍αʔό͕ίωΫ
γϣϯΛ࣋ͭ͜ͱͰΞϓϦߋ৽࣌ʹஅ͕ى͜Βͳ͘ͳΔ • ͱ͍͏Θ͚ͰGoͷϓϩδΣΫτͰ࠾༻͞ΕΔΑ͏ʹͳΓ ·ͨ͠
૾͍͢͠Έ ґଘΛۃྗͳ͘͢͜ͱͰ ΘΕ͘͢͢Δ
ͦΜͳ͜ΜͳͰ
·ͱΊ • kuiperbeltͱ͍͏WebSocketΛҡ࣋ͯ͘͠ΕΔσʔϞϯΛ ॻ͍͍ͯ·͢ • kuiperbeltPerl5 loveͰ͢ɻผʹޙΖͳΜͰ͍͍͚Ε Ͳ࡞ऀతʹPerl5ͷͨΊʹॻ͔Ε͍ͯ·͢ • Ұ෦͚͍ͩ͠ͱ͜ΖΛΓग़͢ͷΧοίΠΠ
• ͬͯײΛฉ͔ͤͯ͘ΕʂʂɹຊޠυΩϡϝϯτॻ ͍ͨͧʂʂʂɹཔΉʂʂʂʂʂ