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
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
430
Agentに至る道 〜なぜLLMは自動でコードを書けるようになったのか〜
mackee
5
4.7k
今!ソフトウェアエンジニアがハードウェアに手を出すには
mackee
14
6.3k
ワンバイナリWebサービスのススメ
mackee
10
8.4k
tanukistack ライブコーディング / tanukistack live-coding
mackee
0
330
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
1k
database/sqlでNullを扱う歴史とsql.Null[T]の登場 / sql.Null[T] history
mackee
0
940
Other Decks in Programming
See All in Programming
Oxlintはいいぞ
yug1224
5
1.4k
Oxlint JS plugins
kazupon
1
980
MDN Web Docs に日本語翻訳でコントリビュート
ohmori_yusuke
0
650
Patterns of Patterns
denyspoltorak
0
1.4k
AI巻き込み型コードレビューのススメ
nealle
2
650
Lambda のコードストレージ容量に気をつけましょう
tattwan718
0
140
インターン生でもAuth0で認証基盤刷新が出来るのか
taku271
0
190
CSC307 Lecture 03
javiergs
PRO
1
490
「ブロックテーマでは再現できない」は本当か?
inc2734
0
1k
2026年 エンジニアリング自己学習法
yumechi
0
140
FOSDEM 2026: STUNMESH-go: Building P2P WireGuard Mesh Without Self-Hosted Infrastructure
tjjh89017
0
170
AgentCoreとHuman in the Loop
har1101
5
240
Featured
See All Featured
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
93
Accessibility Awareness
sabderemane
0
55
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.1k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
250
Navigating Weather and Climate Data
rabernat
0
110
Optimizing for Happiness
mojombo
379
71k
The Cult of Friendly URLs
andyhume
79
6.8k
Music & Morning Musume
bryan
47
7.1k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
350
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.2k
The SEO identity crisis: Don't let AI make you average
varn
0
330
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)ͷݟ͕ஷ·Εߦ͚Δؾ͕͢Δ