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
今!ソフトウェアエンジニアがハードウェアに手を出すには
mackee
11
4.7k
ワンバイナリWebサービスのススメ
mackee
10
8k
tanukistack ライブコーディング / tanukistack live-coding
mackee
0
120
range over funcの使い道と非同期N+1リゾルバーの夢 / about a range over func
mackee
0
870
perl for shell, awk and sed programmers
mackee
3
2.5k
今更GoのWebフレームワークを作ろうとしているワケ / Why am I trying to create a Go web framework now?
mackee
1
840
database/sqlでNullを扱う歴史とsql.Null[T]の登場 / sql.Null[T] history
mackee
0
720
マイクロサービス化を利用した Goへの移行事例
mackee
0
860
PerlでつくるフルスクラッチWebAuthn/パスキー認証 / Demonstration of full-scratch WebAuthn/Passkey Authentication written in Perl
mackee
3
5.1k
Other Decks in Programming
See All in Programming
そのAPI、誰のため? Androidライブラリ設計における利用者目線の実践テクニック
mkeeda
2
270
個人軟體時代
ethanhuang13
0
320
請來的 AI Agent 同事們在寫程式時,怎麼用 pytest 去除各種幻想與盲點
keitheis
0
120
Azure SRE Agentで運用は楽になるのか?
kkamegawa
0
2.1k
CJK and Unicode From a PHP Committer
youkidearitai
PRO
0
110
Navigation 2 を 3 に移行する(予定)ためにやったこと
yokomii
0
140
開発チーム・開発組織の設計改善スキルの向上
masuda220
PRO
20
11k
AIを活用し、今後に備えるための技術知識 / Basic Knowledge to Utilize AI
kishida
22
5.6k
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
340
How Android Uses Data Structures Behind The Scenes
l2hyunwoo
0
410
機能追加とリーダー業務の類似性
rinchoku
2
1.2k
詳解!defer panic recover のしくみ / Understanding defer, panic, and recover
convto
0
230
Featured
See All Featured
Testing 201, or: Great Expectations
jmmastey
45
7.7k
A Tale of Four Properties
chriscoyier
160
23k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.4k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
18
1.1k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
46
7.6k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
Optimising Largest Contentful Paint
csswizardry
37
3.4k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.7k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
34
6k
What's in a price? How to price your products and services
michaelherold
246
12k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
51
5.6k
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ͷͨΊʹॻ͔Ε͍ͯ·͢ • Ұ෦͚͍ͩ͠ͱ͜ΖΛΓग़͢ͷΧοίΠΠ
• ͬͯײΛฉ͔ͤͯ͘ΕʂʂɹຊޠυΩϡϝϯτॻ ͍ͨͧʂʂʂɹཔΉʂʂʂʂʂ