$30 off During Our Annual Pro Sale. View Details »
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
78
Agentに至る道 〜なぜLLMは自動でコードを書けるようになったのか〜
mackee
5
3.5k
今!ソフトウェアエンジニアがハードウェアに手を出すには
mackee
14
5.7k
ワンバイナリWebサービスのススメ
mackee
10
8.1k
tanukistack ライブコーディング / tanukistack live-coding
mackee
0
140
range over funcの使い道と非同期N+1リゾルバーの夢 / about a range over func
mackee
0
1.1k
perl for shell, awk and sed programmers
mackee
3
2.6k
今更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
910
Other Decks in Programming
See All in Programming
chocoZAPサービス予約システムをNuxtで内製化した話
rizap_tech
0
110
Full-Cycle Reactivity in Angular: SignalStore mit Signal Forms und Resources
manfredsteyer
PRO
0
140
AIコーディングエージェント(Gemini)
kondai24
0
230
俺流レスポンシブコーディング 2025
tak_dcxi
14
8.8k
認証・認可の基本を学ぼう後編
kouyuume
0
240
Microservices rules: What good looks like
cer
PRO
0
1.4k
Rediscover the Console - SymfonyCon Amsterdam 2025
chalasr
2
160
TUIライブラリつくってみた / i-just-make-TUI-library
kazto
1
390
Socio-Technical Evolution: Growing an Architecture and Its Organization for Fast Flow
cer
PRO
0
340
ハイパーメディア駆動アプリケーションとIslandアーキテクチャ: htmxによるWebアプリケーション開発と動的UIの局所的適用
nowaki28
0
420
TestingOsaka6_Ozono
o3
0
160
【Streamlit x Snowflake】データ基盤からアプリ開発・AI活用まで、すべてをSnowflake内で実現
ayumu_yamaguchi
1
120
Featured
See All Featured
A Modern Web Designer's Workflow
chriscoyier
698
190k
Embracing the Ebb and Flow
colly
88
4.9k
Why Our Code Smells
bkeepers
PRO
340
57k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
34k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
970
What’s in a name? Adding method to the madness
productmarketing
PRO
24
3.8k
The Cult of Friendly URLs
andyhume
79
6.7k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.3k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.6k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.3k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
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)ͷݟ͕ஷ·Εߦ͚Δؾ͕͢Δ