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
Perl + Go実運用の話
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
mackee
December 16, 2015
Programming
4
1.3k
Perl + Go実運用の話
Gotanda.pm #7 vs Yokohama.pm #13
mackee
December 16, 2015
Tweet
Share
More Decks by mackee
See All by mackee
perlをWebAssembly上で動かすと何が嬉しいの??? / Where does Perl-on-Wasm actually make sense?
mackee
0
620
Agentに至る道 〜なぜLLMは自動でコードを書けるようになったのか〜
mackee
6
5.1k
今!ソフトウェアエンジニアがハードウェアに手を出すには
mackee
14
6.6k
ワンバイナリWebサービスのススメ
mackee
10
8.5k
tanukistack ライブコーディング / tanukistack live-coding
mackee
0
450
range over funcの使い道と非同期N+1リゾルバーの夢 / about a range over func
mackee
0
1.1k
perl for shell, awk and sed programmers
mackee
3
2.7k
今更GoのWebフレームワークを作ろうとしているワケ / Why am I trying to create a Go web framework now?
mackee
1
1.1k
database/sqlでNullを扱う歴史とsql.Null[T]の登場 / sql.Null[T] history
mackee
0
960
Other Decks in Programming
See All in Programming
Understanding Apache Lucene - More than just full-text search
spinscale
0
140
ロボットのための工場に灯りは要らない
watany
11
3.1k
Codexに役割を持たせる 他のAIエージェントと組み合わせる実務Tips
o8n
4
1.4k
Vuetify 3 → 4 何が変わった?差分と移行ポイント10分まとめ
koukimiura
0
180
ポーリング処理廃止によるイベント駆動アーキテクチャへの移行
seitarof
3
1.2k
車輪の再発明をしよう!PHP で実装して学ぶ、Web サーバーの仕組みと HTTP の正体
h1r0
2
300
今年もTECHSCOREブログを書き続けます!
hiraoku101
0
120
守る「だけ」の優しいEMを抜けて、 事業とチームを両方見る視点を身につけた話
maroon8021
3
1.3k
Java 21/25 Virtual Threads 소개
debop
0
250
Rethinking API Platform Filters
vinceamstoutz
0
150
OTP を自動で入力する裏技
megabitsenmzq
0
120
「効かない!」依存性注入(DI)を活用したAPI Platformのエラーハンドリング奮闘記
mkmk884
0
170
Featured
See All Featured
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.2k
Become a Pro
speakerdeck
PRO
31
5.9k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.2k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
400
Bash Introduction
62gerente
615
210k
It's Worth the Effort
3n
188
29k
Imperfection Machines: The Place of Print at Facebook
scottboms
269
14k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
500
Raft: Consensus for Rubyists
vanstee
141
7.4k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
250
How to make the Groovebox
asonas
2
2k
Transcript
Perl + Go࣮ӡ༻ͷ @mackee_w a.k.a Ϛίϐʔ ໘ന๏ਓΧϠοΫ 2015-12-16 Gotanda.pm #7
vs Yokohama.pm #13
͜ΜΜΘ
୭ʁ • Yokohama.pm෭ Ϧʔμʔ • twitter:@mackee_w • github:mackee • ໘ന๏ਓΧϠοΫ
• ιʔγϟϧήʔϜͷ ։ൃͱӡ༻PG
None
Perl + Go࣮ӡ༻ͷ @mackee_w a.k.a Ϛίϐʔ ໘ന๏ਓΧϠοΫ 2015-12-16 Gotanda.pm #7
vs Yokohama.pm #13
෭
·ͨ զʑ
Կʹͯ͠Perl ͚ͩΛ͏͜ ͱΛࢭΊͯ https://flic.kr/p/q6cRh
GoͱPerlͷΩ ϝϥΛӡ༻͢ ΔΑ͏ʹͳͬ ͔ͨ https://twitter.com/bradfitz/status/335213285815226369
Section.0 Perl + Goͷ ߏ
UnityͷΫϥΠΞϯτ (iOS/Android)
ELBͰड͚ͯPerlͷཱͬͯΔ AppαʔόʹϦόʔεϓϩΩγ
MySQLͷRDSʹAppαʔό͕ ܨ͛ͯΔ
ී௨ͳײ͡ Ͱʁʁʁ
͜ͷߏ͕ෳ͋ͬͯ
Goͷαʔόʹ෦APIͰୟ͘
None
Section.1 Goͷ࠾༻
༩͑ΒΕͨ݅ • ఆDAUʹ͑ΒΕΔ͜ͱ • γϯάϧϚελʔͩͱͭΒͦ͏ͳײ͕͡աڈ ͷ࣮͔Βͯ͠ఆ͞ΕΔ • શੈքʹಉ͡ΞϓϦΛ৴͢Δ • ϚϧνϦʔδϣϯ/DCࢹʹ
γϟʔσΟϯάʁʁʁ • DBIx::Classͷຐज़ʹΑΓطଘͷίʔυʹ JOIN͕͍ͬͺ͍ • ͦͷ··ΔͳΒMySQL Clusterͱ͔Spider Engineͱ͔͚ͩΕͲฐࣾͰ࣮ͳ͍͠RDS ͍͍ͨ͠
ήʔϜͷσʔλͷྲྀΕΛݟΔ • શϢʔβϥϯΫͱݺΕΔख़࿅͝ͱͷ֊ ʹ͔ΕͯͦͷதͰϦʔάʹ͔ΕΔ • ࢼ߹(ͱݺΕΔఆ࣌ʹߦΘΕΔGvG)Ϧʔά ͷάϧʔϓ͝ͱʹߦΘΕΔ • γʔζϯ࠷ޙʹϦʔάͷ্ҐऀͰτʔ φϝϯτΛߦ͏
Αͬ͠ΌϦʔάͰDB͚Α͏ • ͪΐ͏ͲϦʔάΛҬผʹ͢Δ͕͋ͬͨͷ ͰͦΕʹͷ͔ͬͬͨ(=>ϚϧνϦʔδϣϯ) • ͰݟͨϫϯϫʔϧυΛ࣮ݱ͢Δ(ϑϨϯυ ΫϥϒҠ੶ͳͲ)ͨΊʹதԝαʔό͕ඞཁ • ͦͯ͠಄ͷߏ͕ग़དྷ্͕ͬͨ
͜ͷ࣌Ͱ GoΛ࠾༻͢Δ ཧ༝Λ୳͍ͯͨ͠
http://www.kayac.com/news/2014/07/golang
ͦΕ͔ΒԿϲ݄͔ܦͬͯ • झຯͰॻ͍ͨΓଞͷαʔϏεͰϛυϧΣΞ ͱͯ͠ಈ͍͍ͯΔౕΛݟͨΓ͍ͯͯ͠ಛੑత ͳͷݟ͖͑ͯͨ • ιγϟήʔΛ·Δ͖ͬΓϦϓϨʔε͢Δͷ େมͩͱࢥ͏͕ɺػೳ͕ߜΒΕͯͨΒ͍͍ײ ͡ʹͳΔؾ͕͢Δ
Ϊδϡπతͳཧ༝͚ • Perlଆͷαʔόʹ1ʹ͖ͭଟͷϓϩηεཱ͕ͭ͜ͱ ʹͳΔ • ͦͷଟͷϓϩηε͔ΒͷHTTPϦΫΤετΛ͘͞ͷͨ Ίʹಉ͡ϓϩηεͷPerlΛཱͯͯͨΒҙຯ͔Μͳ͍ ײ͡ʹͳΔͷͰ(ͪΖΜ෦APIͷ͍ํʹΑͬͯͦ ͏ͳΒͳ͍ؾ͢Δ) •
ϦιʔεΛޮతʹ͑ΔݴޠͰॻ͘ͷ͕͍͍ؾ͕͢Δʂ
Section.2 GoΛॻ͘
ࣾͷPerlͷίʔυ
ܕͰΨνΨνʹݻΊ͍ͯΔ ͷ͕΄ͱΜͲ
ܕΛຖճॻ͍͍ͯ ΔͳΒͦΕΛͬ ͯίϯύΠϧ࣌ʹ ղܾͨ͠΄͏͕Α ͘Ͷʁ
ํ • Ͱ͖Δ͚ͩ Go way Λࢦ͢ • net/httpΛͦͷ··͏ • Ͱ͖Δ͚ͩPerlΛॻ͍͍ͯͨ࣌ͱಉ͡ߟ͑Ͱॻ
͚ΔΑ͏ʹ͢Δ • Goʹͳͬͯศརʹͳͬͨ͜ͱར༻͢Δ
IDLͷ • IDL = Interface Definition Language • ྫ: JSON
Schema, Swagger, Protobuf • RPCͳͲͷΠϯλʔϑΣΠεΛઐ༻ݴޠͰఆٛ ͯͦ͠ΕΛར༻ͯ͠ίʔυΛੜͨ͠Γ͢Δ
ฐࣾͷIDLͷ • ͱͱBaalͱ͍͏ಠࣗIDL͕ࣾͰΘΕ͍ͯ ͨ • BaalͰServiceͱεΩʔϚΛఆٛ͠ɺC#(Unity)ͷ APIୟ͘ίʔυΛੜ͢Δ • PerlͰίϯτϩʔϥͷςετΛॻ͘ͱ͖ʹBaalͰ ܕεΩʔϚ͕͍͋ͬͯΔ͔ΛνΣοΫ͢Δ
go generateͷػӡ • BaalͰΫϥΠΞϯτ͕ੜͰ͖ΔͳΒαʔό (ͷίϯτϩʔϥ)ੜͰ͖Δͣ • ͬͯΈͨ -> Ͱ͖ͨ •
ϝϦοτ: ϦΫΤετΛύʔεͯ͠Goͷܕʹม ͢ΔͷͰิʹग़ͯ͘Δ࠷ߴ
࣮ࡍͷBaalͷྫ ϑϨϯυਃ namespace Data.Request { entity FriendRequestRequest { /# ਃ͢ΔϢʔβ
#/ UserId: !long; /# ਃ͞ΕΔϢʔβ #/ TargetUserId: !long; } } namespace Data.Response { entity FriendRequestResponse { /# 1: ਃத 2: ਃ͞Εத 3: ϑϨϯυొࡁΈ #/ Status: !integer; } }
࣮ࡍͷBaalͷྫ ϑϨϯυਃ namespace Service { service FriendService { /# <short>༑ͩͪਃ</short>
<url>/api/friend/request</url> <request_method>POST</request_method> #/ Request: <= !Data.Request.FriendRequestRequest => !Data.Response.FriendRequestResponse; } }
ੜ͞Εͨίʔυ
ੜ͞Εͨίʔυ
͜ͷίʔυΛ͏ͱ͜Ζ
͜ͷίʔυΛ͏ͱ͜Ζ ิʹग़ͯ͘Δʂʂʂ
Go͔ΒDBΛѻ͏ • ORMΛΘͣʹΫΤϦϏϧμʔΛ͏Α͏ʹͨ͠ • ϥΠϒϥϦ࠾༻ͷํͱͯ͠ʮ͕ࣗॻ͚ͦ͏ɺ ͕ࣗϝϯςͰ͖ͦ͏ʯͳͷͱ͍͏ͷ͕͋Γ ·ͨ͠ • Ҏલgorpͬͨ͜ͱ͕͋ͬͯͦΜͳʹ͖͡Όͳ ͔ͬͨ
Go͔ΒDBΛѻ͏ • ͱ͍͑DDLͱGoͷstructͱಉ͜͡ͱΛ2ॻ ͘ͷਏ͍ • ͷͰGoͷstructΛλά͖Ͱॻ͍ͨΒDDLʹม ͢ΔͷΛॻ͍ͨ -> ͑ͨ࠷ߴ •
Γग़ͨ͠ -> github.com/mackee/go-genddl
͜Ε͕
͜͏ͳΔ
Section.3 Perl͔ΒGo
Perl͔ΒGoʹͭͳ͙ • GoͷAPIαʔόεςʔτϨεͳRESTful JSON API • ೝূͳ͠ɺηογϣϯͳ͠ • FurlͰͭͳ͍ͰϦΫΤετΛJSONʹύʔε͢ ΔΫϥεΛPerlଆʹ༻ҙͯͦ͠ΕΛ͏
Goଆ͕མͪͯΔ࣌ʁ • Goଆ͕མͪͯશαʔόμϯආ͚͍ͨ • ํ1: ෦APIΛ༻͍ΔAPIΛݶఆ͢Δ • ํ2: མ͍ͪͯͯͳΜͱ͔Ͱ͖Δ߹ͳΜͱ͔͢ Δ
• ํ3: མ͍ͪͯͯͳΜͱ͔Ͱ͖ͳ͍߹ૉʹࢮ ΜͰΤϥʔΛग़͢
ͳΜͱ͔Ͱ͖Δ߹ͳΜͱ͔ ͢Δ • ྫ: ϩάΠϯޙʹදࣔ͞ΕΔϚΠϖʔδͷ͓ ΒͤAPI(࣮͓Βͤதԝαʔόʹ෦API Ͱ͍߹Θͤͯ৴͍ͯ͠Δʂʂʂ) • ࢮΜͰ͍Δ߹ ->
200Ҏ֎͕ؼ͖ͬͯͨ࣌ͷ ྫ֎ΛΩϟονۭͯͬ͠ΆΛฦ͢ -> શମͱ͠ ͯੜ͔͢
τϥϯβΫγϣϯ͕͑ͳ͍ • ผαʔόผDBͳͷͰવͦͷؒͰී௨ͷτϥϯβ Ϋγϣϯ͑ͳ͍ • ͳͷͰGoଆAPIΛႈ(ಉ͡ϦΫΤετΛԿୟ͍ ͯಉ݁͡ՌʹͳΔ)ʹͳΔΑ͏ʹྀ͢Δ • ྫ:
ϑϨϯυਃΛ2ୟ͍ͯʮϑϨϯυਃ͠ ͨΑʔʯͱฦ͢ɻDBͷঢ়ଶ2ͦͷ··
Section.4 Ωϝϥͷӡ ༻
σϓϩΠํ๏ • consulͷϚϧνDCͰͦΕͧΕߏ͞Ε͍ͯΔ • ͦΕͧΕͷDCʹconsul eventΛൃߦ͢Δ -> stretcher ͰS3ʹ্͛ͨtarballΛpull͖ͯͯ͠σϓϩΠ •
σϓϩΠ͢Δͷಉ͡tarballʂʂ̍̍ • daemontoolsͰཱͬͯΔαʔϏε͕ҧ͏
GoͷϏϧυํ๏ • σϓϩΠεΫϦϓτͰϏϧυ͍ͯ͠Δ • ґଘύοέʔδͦ͜Ͱͱ͍ͬͯΔ • ςετ͍ͯ͠Δͷͱ͕ࠩग़ΔՄೳੑ͕͋Δ…… ͪΐͬͱා͍ • ґଘύοέʔδࣗͷσΟϨΫτϦҎԼʹִ͍ͯ͠
Δ(vendoringͬΆ͍͚ΕͲόʔδϣϯཧ͍ͯ͠ͳ͍)
None
࣮ࡍʹӡ༻ʹೖͬͯ • GoଆىҼͷόάτϥϒϧͳ͠(!) • ຊʹؾΛ͚ͭ·ͬͯ͘ॻ͍͍ͯΔͷͰͦΕ͕ޭ Λ͍ͯ͠Δؾ͕͠ͳ͍Ͱͳ͍ • ͋ͱCPUͷෛՙ͕ΊͪΌগͳͯ͘ຊʹಈ͍ͯ ͍Δͷ͔৺ʹͳΔϨϕϧ(ൺֱରDBIx::Class ͱDateTimeΛΨϯΨϯ͍ͬͯΔPerlଆͷαʔό)
Έ • νʔϜʹGoͷίʔυʹखΛग़ͤΔਓ͕গͳ ͍ • ͦΜͳʹػձ͕ଟ͘ͳ͍ͷ͋Δ • ؾ߹ೖΕͯॻ͔ͳ͍ͱ͍͚ͳ͍͠ɺԿΑΓจ Խݍ/ߟ͑ํ͕ҧ͏ͷͰֶͼ͠ʹͳΔ
·ͱΊ • GoͰϑϨϯυͱ͔࣮͢Δͷ͕ඇৗʹ಄Λ͜Ͷ͘Γճͯ͠๐ ͖ͳ͕Β͚ͬͨΕͲษڧʹͳͬͨؾ͕͢Δ • ϚΠΫϩαʔϏεతʹαʔό͚ΔͷΞϦ͔͠Εͳ͍(Ψνϟ ͱ͔ڞ௨Ͱ͠ΐ) • ͕ɺτϥϯβΫγϣϯ͕Γ •
GoͰϑϧεϖοΫͷιγϟήʔΛॻ͘ͷࠓͷஈ֊Ͱແཧʂɹ ͚ͩΕͲϥΠϒϥϦ(ಛʹORM)ͷݟ͕ஷ·Εߦ͚Δؾ͕͢Δ