Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
The tale of kuiperbelt ...and Perl.
Search
mackee
July 14, 2017
Programming
1
2.4k
The tale of kuiperbelt ...and Perl.
吉祥寺.pm11
mackee
July 14, 2017
Tweet
Share
More Decks by mackee
See All by mackee
tanukistack ライブコーディング / tanukistack live-coding
mackee
0
61
range over funcの使い道と非同期N+1リゾルバーの夢 / about a range over func
mackee
0
320
perl for shell, awk and sed programmers
mackee
2
1.8k
今更GoのWebフレームワークを作ろうとしているワケ / Why am I trying to create a Go web framework now?
mackee
1
250
database/sqlでNullを扱う歴史とsql.Null[T]の登場 / sql.Null[T] history
mackee
0
180
マイクロサービス化を利用した Goへの移行事例
mackee
0
310
PerlでつくるフルスクラッチWebAuthn/パスキー認証 / Demonstration of full-scratch WebAuthn/Passkey Authentication written in Perl
mackee
3
3.8k
SRE定例やその辺の取り組みをアプリケーションエンジニア目線で語る / "Observe" about SRE Meeting by Application Engineer
mackee
0
1.9k
TinyGoで使えるORM sqllaの 紹介とTinyGoで使えるようにするための工夫
mackee
0
1.4k
Other Decks in Programming
See All in Programming
Bedrock Agentsレスポンス解析によるAgentのOps
licux
3
890
DRFを少しずつ オニオンアーキテクチャに寄せていく DjangoCongress JP 2025
nealle
2
190
密集、ドキュメントのコロケーション with AWS Lambda
satoshi256kbyte
1
210
Software Architecture
hschwentner
6
2.1k
PRレビューのお供にDanger
stoticdev
1
210
Rails アプリ地図考 Flush Cut
makicamel
1
130
Djangoにおける複数ユーザー種別認証の設計アプローチ@DjangoCongress JP 2025
delhi09
PRO
4
400
sappoRo.R #12 初心者セッション
kosugitti
0
270
Open source software: how to live long and go far
gaelvaroquaux
0
650
昭和の職場からアジャイルの世界へ
kumagoro95
1
410
Boost Performance and Developer Productivity with Jakarta EE 11
ivargrimstad
0
550
GAEログのコスト削減
mot_techtalk
0
120
Featured
See All Featured
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
114
50k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
4
350
Rebuilding a faster, lazier Slack
samanthasiow
80
8.8k
The World Runs on Bad Software
bkeepers
PRO
67
11k
Automating Front-end Workflow
addyosmani
1368
200k
Raft: Consensus for Rubyists
vanstee
137
6.8k
A Philosophy of Restraint
colly
203
16k
A Modern Web Designer's Workflow
chriscoyier
693
190k
[RailsConf 2023] Rails as a piece of cake
palkan
53
5.3k
YesSQL, Process and Tooling at Scale
rocio
172
14k
How to Think Like a Performance Engineer
csswizardry
22
1.4k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
29k
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ͷͨΊʹॻ͔Ε͍ͯ·͢ • Ұ෦͚͍ͩ͠ͱ͜ΖΛΓग़͢ͷΧοίΠΠ
• ͬͯײΛฉ͔ͤͯ͘ΕʂʂɹຊޠυΩϡϝϯτॻ ͍ͨͧʂʂʂɹཔΉʂʂʂʂʂ