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
WebSocket Connection Proxy kuiperbeltの プラグイン機構の実装
Search
mackee
February 16, 2016
Programming
0
4.3k
WebSocket Connection Proxy kuiperbeltの プラグイン機構の実装
Shibuya.go
http://shibuyago.connpass.com/event/25852/
mackee
February 16, 2016
Tweet
Share
More Decks by mackee
See All by mackee
今!ソフトウェアエンジニアがハードウェアに手を出すには
mackee
12
4.8k
ワンバイナリ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
850
database/sqlでNullを扱う歴史とsql.Null[T]の登場 / sql.Null[T] history
mackee
0
730
マイクロサービス化を利用した Goへの移行事例
mackee
0
860
PerlでつくるフルスクラッチWebAuthn/パスキー認証 / Demonstration of full-scratch WebAuthn/Passkey Authentication written in Perl
mackee
3
5.2k
Other Decks in Programming
See All in Programming
Namespace and Its Future
tagomoris
6
710
実用的なGOCACHEPROG実装をするために / golang.tokyo #40
mazrean
1
290
アプリの "かわいい" を支えるアニメーションツールRiveについて
uetyo
0
280
速いWebフレームワークを作る
yusukebe
5
1.7k
スケールする組織の実現に向けた インナーソース育成術 - ISGT2025
teamlab
PRO
1
160
さようなら Date。 ようこそTemporal! 3年間先行利用して得られた知見の共有
8beeeaaat
3
1.5k
AWS発のAIエディタKiroを使ってみた
iriikeita
1
190
複雑なドメインに挑む.pdf
yukisakai1225
5
1.2k
私の後悔をAWS DMSで解決した話
hiramax
4
210
RDoc meets YARD
okuramasafumi
4
170
デザイナーが Androidエンジニアに 挑戦してみた
874wokiite
0
550
チームのテスト力を鍛える
goyoki
3
890
Featured
See All Featured
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
285
14k
Making the Leap to Tech Lead
cromwellryan
135
9.5k
Practical Orchestrator
shlominoach
190
11k
[RailsConf 2023] Rails as a piece of cake
palkan
57
5.8k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
31
2.2k
Git: the NoSQL Database
bkeepers
PRO
431
66k
Automating Front-end Workflow
addyosmani
1370
200k
What’s in a name? Adding method to the madness
productmarketing
PRO
23
3.7k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
18
1.1k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
GraphQLとの向き合い方2022年版
quramy
49
14k
Transcript
WebSocket Connection Proxy kuiperbeltͷ ϓϥάΠϯػߏͷ࣮ @mackee_w a.k.a macopy
• twitter:@mackee_w • github:mackee • ໘ന๏ਓΧϠοΫ • ιʔγϟϧήʔϜͷ ։ൃͱӡ༻PG •
Perl / Go ୭ʁ
ॻ͍ͨύοέʔδ • github.com/mackee/go-sqlla • code generate͢Δײ͡ͷΫΤϦϏϧμ
ॻ͍ͨύοέʔδ • github.com/mackee/go-sqlla • code generate͢Δײ͡ͷΫΤϦϏϧμ
ॻ͍ͨύοέʔδ • github.com/mackee/go-genddl • struct͔ΒSQLͷDDLΛ࡞Δ܅
ॻ͍ͨύοέʔδ • github.com/mackee/go-genddl • struct͔ΒSQLͷDDLΛ࡞Δ܅
go generateେ͖ਓؒͰ͢
࠷ۙ(ࣄͰ)ͬͨ͜ͱ https://speakerdeck.com/mackee/perl-plus-goshi-yun-yong-falsehua
PerlͷҰຕΞϓϦ͔Β GoΓग़͠ • ෳDBΛԣஅ͢ΔΑ͏ͳใΛ࣋ͬͨAPI αʔόΛGoͰॻ͍ͯΓग़͢ • ϢʔβొɺIDൃ൪ɺιʔγϟϧάϥϑetc… • ιʔγϟϧήʔϜΛશ෦GoͰॻ͘ͷ·ͩͭ Β͍ͱ͍͏ҹ
ιʔγϟϧήʔϜͷ ػೳͷଟ͞
ιʔγϟϧήʔϜͷػೳͷଟ͞ • ϑϨϯυొ • ثతͳϠπͷඋɺ߹ɺਐԽ • Ψνϟ • ҭཁૉ(͢͝Ζ͘) •
GvG(ࢼ߹)
ιʔγϟϧήʔϜͷػೳͷଟ͞ • ϑϨϯυొ • ثతͳϠπͷඋɺ߹ɺਐԽ • Ψνϟ • ҭཁૉ(͢͝Ζ͘) •
GvG(ࢼ߹) • ɾɾɾ͜ΕΒΛϦΞϧλΠϜͰɹˡNew!
ϦΞϧλΠϜʁʁʁʁ
࠷ۙͷτϨϯυͱͯ͠ͷ ϦΞϧλΠϜ • GvGͱ͔PvPͱ͔ͷରਓઓڠྗϓϨΠ͕ग़ͯ ͖ͯɺଞਓͷεϚϗͰߦͬͨߦಈΛʮଈ࠲ʹʯ ࣗͷͱ͜Ζʹөͤ͞Δඞཁ͕͋Δ • ϦΞϧλΠϜײͱ͍͏ͷɺΓ্͕ΓΛԋ शͭͨ͠Γਓͱ͍ͬͯΔײΛग़͢ͷʹඞཁ ͳཁૉʹͳΓͭͭ͋Δ
ϦΞϧλΠϜͷ࣮ݱํ๏ • ྫ͑ಠࣗϓϩτίϧΛੜιέοτͰ͠ΌΔήʔϜαʔόΛ C++͋ͨΓͰॻ͘ • ήʔϜαʔόͱϦΞϧλΠϜ෦ʹඞཁͳήʔϜͷཁૉ෦ (εΩϧൃಈʂͱ͔)࣮ͯ͠DBʹॻ͖ࠐΜͩΓͱ͔ • Ή͠ΖDBհͣ͞ʹͳΜ͔಄͍͍ײ͡ͰԣͱΓऔΓͨ͠Γͱ ͔
• HTTP͠ΌΔαʔό͔͠ॻ͍͖͍ͯͯͳ͍ͷʹͦΜͳεΩϧ ͳ͔ͬͨɾɾɾ
ιέοτͱ͔Α͘Θ͔Μͳ͍ ͷͰ Webඪ४ʹ͔ͬΓ·͢ ↓ WebSocket
PerlͰWebSocketΛ͠Ό…… WSͰͭͳ͙
PerlͰWebSocketΛ͠Ό…… ͝ʹΐ͝ʹΐܭࢉ…
PerlͰWebSocketΛ͠Ό…… DBʹॻ͖ࠐΈத…
PerlͰWebSocketΛ͠Ό…… DBʹॻ͖ࠐΈத… WSͰͭͳ͙…
PerlͰWebSocketΛ͠Ό…… DBʹॻ͖ࠐΈத… WSͰͭͳ͙… ͪΐͬͱࠓࣄதͳΜͰ…
PerlͰWebSocketΛ͠Ό…… DBʹॻ͖ࠐΈத… ͑ͬ ͪΐͬͱࠓࣄதͳΜͰ…
ͬͺΓC++Ͱ……
ͦ͏ͩWSΛ͠Όͬͯ ͭͳ͗ͬͺʹͯ͘͠ΕΔ ઐ༻ͷαʔόΛॻ͜͏ ↓ kuiperbelt
͍͍ͩͨ͜Μͳײ͡ • client͕kuiperbeltʹWSͰͭͳ͛ΔͱޙΖͷ PerlʹೝূϦΫΤετΛ͛ͯ200ͩͬͨΒ WS։࢝ • ޙΖͷPerl͔ΒkuiperbeltʹHTTPͰϦΫΤε τΛ͛ΔͱWSͰϝοηʔδΛૹ͢Δ
͍͍ͩͨҎԼͷهࣄʹ http://qiita.com/mackee_w/items/b6036d132888caaf5f98
ΫϥελԽͱ ϓϥάΠϯͷ
ݱঢ়ͷkuiperbeltͷࢄͷ Έ • Ұ൪ॳΊͷೝূϦΫΤετͷ࣌ʹϔομʹࣗͷϗ ετ໊Λ͚ͯૹ͍ͬͯΔ • ͜ͷΫϥΠΞϯτʹૹΓ͍ͨͱ͖ͦͷϗετ໊Λ ͍ͬͯͩ͘͞ͱͳΔ(redisͱ͔ʹอଘ͠ͱ͍ͯͶ) • ͜ΕͩͱͲͷαʔόʹͲͷΫϥΠΞϯτ͕ͿΒԼ͕ͬ
͍ͯΔ͔ΛόοΫΤϯυଆ͕ҙࣝ͠ͳ͍ͱ͍͚ͳ͍
ݱঢ়ͷkuiperbeltͷࢄͷ Έ LVJQFSCFMU CBDLFOE
LVJQFSCFMU CBDLFOE ೝূͷͱ͖ʹ ͭͳ͕ͬͨkuiperbeltͷϗετΛ௨͢Δ ଓ࣌
CBDLFOE LVJQFSCFMU ηογϣϯΩʔͱϗετ໊ͷϖΞΛอଘ ଓ࣌
CBDLFOE LVJQFSCFMU ηογϣϯΩʔ͔Βϗετ໊ΛऔΔ ૹ৴࣌
CBDLFOE ϗετ໊Ͱͭͳ͕͍ͬͯΔkuiperbeltΛࢦ໊ͯ͠ ௨৴͢Δ ૹ৴࣌ LVJQFSCFMU
όοΫΤϯυ͕ Ͳͷαʔόʹͭͳ͕͍ͬͯΔ ͔Ͳ͏͔Λߟྀ͢Δඞཁ͕͋ Δ
ͦͷଞϦΞϧλΠϜήʔϜαʔ όͷྫ • ʮ͍ͭ͜ʹͭͳ͛ʂʯ͍ͬͯ͏αʔόΛࣄલ ʹAPIͰࢦఆ͍ͯͦͭ͠ʹܨ͍ͰΒ͏ • ϝϦοτ: ภΓΛίϯτϩʔϧ • Ͳ͜ʹͭͳ͍ͰͲ͜ʹૹ৴ͯ͠Α͠ͳʹ
ϝοηʔδΛૹͬͯ͘ΕΔ
ͦͷଞϦΞϧλΠϜήʔϜαʔ όͷྫ • ʮ͍ͭ͜ʹͭͳ͛ʂʯ͍ͬͯ͏αʔόΛࣄલ ʹAPIͰࢦఆ͍ͯͦͭ͠ʹܨ͍ͰΒ͏ • ϝϦοτ: ภΓΛίϯτϩʔϧ • Ͳ͜ʹͭͳ͍ͰͲ͜ʹૹ৴ͯ͠Α͠ͳʹ
ϝοηʔδΛૹͬͯ͘ΕΔ ͜ΕΛΓ͍ͨʂʂʂ ↓
node.jsͱ͔ͰΑ͋͘Δͭ ↓ ԣͷҙࢥૄ௨ʹ redis pubsubΛ͏
pubsubΛར༻͢Δ • ͕͍ࣗ࣋ͬͯΔΫϥΠΞϯτͰ͋Εࠓ· ͰͲ͓Γ͍ͦͭʹϝοηʔδΛૹ • ͍࣋ͬͯͳ͚ΕΫϥΠΞϯτ͕͋Δ͔Ͳ͏ ͔Λ͍߹Θͤͯpublish͢Δ • όοΫΤϯυଆΫϥΠΞϯτͱαʔόͷ ΛҙࣝͤͣʹϝοηʔδΛ͛ΒΕΔ
શһʹඞਢͷػೳ͔ʁ • ผʹόοΫΤϯυ͕ؤுΕredisͷυϥΠό ΛೖΕͳͯ͘ྑ͍ • redis pubsubҎ֎ʹಉ༷ͷػೳΛผͷΓ ํͰ࣮ݱͰ͖ΔՄೳੑ͕͋Δ • ແͯ͘ಈ͘Α͏ʹ࡞Εͳ͘ͳ͍
ϓϥάΠϯԽ͢Δ
GoͷϓϥάΠϯ • goϏϧυ࣌ʹશ෦ͷϥΠϒϥϦΛؚΊͯ͠ ·͏ͷͰಈతϩʔυͷΈ͕ͳ͍(1.5ͰϥΠ ϒϥϦԽग़དྷΔͷೖ͕ͬͨ·ͩෆ҆ఆͱ͍ ͏͔͑Δͷ͔ʁ) • ผͷϓϩηεͱ্ཱͯͪ͛ͯ͠ϓϩηεؒ௨ ৴͢Δͷ͕Ұൠత
GoͷແཧΓϓϥάΠϯԽ .BJO1SPDFTT 1MVHJO1SPDFTT" 1MVHJO1SPDFTT# ϓϩηεؒ௨৴
github.com/dullgiulio/pingo • net/rpc + pluginͷϓϩηεؒͰΑ͠ͳʹίω Ϋγϣϯషͬͯ͘ΕΔ + stdout/errͷ౷߹ • جຊతʹnet/rpcͳͷͰͦΕҎ্ग़དྷͳ͍
• ίϚϯυʹউखʹΦϓγϣϯ͕ੜ͑Δ
͍ํ
͍ํ ͭͳ͛ͯ͠·͑͋ͱnet/rpc
͍ํ structΛొ͢Δͱ͍ͦͭͷmethodΛ ݺΔΑ͏ʹͳΔ
ࠐΜͩͱ͜Ζ • ଓ࣌ -> hookͯ͠pluginʹొ • pluginଆredisͰchannelΛsubscribe • அ࣌ ->
hookͯ͠plugin͔Βআ • pluginଆsubscribe͍ͯ͠ΔνϟϯωϧΛ আ
ࠐΜͩͱ͜Ζ • ૹ৴࣌ -> ࣗʹΩʔ͕ͳ͚Εpluginʹ͛Δ • pluginͱΓ͋͑ͣpublish͢Δ͕ड͚Δ subscriber͕͍ͳ͚Εແ͍ΑͬͯΤϥʔΛฦ͢ • ड৴࣌
-> pluginͷsubscribeΛݟ͍ͯΔ͕ͭདྷͨ Βϩϯάϙʔϧ(?)͍ͯ͠ΔRPCͰϝοηʔδΛฦ͢ (ͬͱ͏·͘Γ͍ͨ)
demo (͕࣌ؒ͋ͬͨΒ)
·ͱΊ • PerlͰDBͱ͔Λ·ͱʹ͍ͭͭWSΓ͍ͨ ͷͰGoͰαʔόॻ͖·ͨ͠ • GoͰແཧΓPluginॻ͍ͯͦͷαʔόʹredis pub/subͬͯෳݐͯΒΕΔΑ͏ʹ͠·ͨ͠ • GoͰಈతϩʔυग़དྷΔΑ͏ʹͳͬͯ΄͍͠
Yokohama\.(go|pm6?)Γ·͢ʂ http://yokohamapm.connpass.com/event/26969/