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
Agentに至る道 〜なぜLLMは自動でコードを書けるようになったのか〜
mackee
4
1.3k
今!ソフトウェアエンジニアがハードウェアに手を出すには
mackee
14
5.5k
ワンバイナリWebサービスのススメ
mackee
10
8.1k
tanukistack ライブコーディング / tanukistack live-coding
mackee
0
130
range over funcの使い道と非同期N+1リゾルバーの夢 / about a range over func
mackee
0
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
990
database/sqlでNullを扱う歴史とsql.Null[T]の登場 / sql.Null[T] history
mackee
0
880
マイクロサービス化を利用した Goへの移行事例
mackee
0
1k
Other Decks in Programming
See All in Programming
Bakuraku E2E Scenario Test System Architecture #bakuraku_qa_study
teyamagu
PRO
0
730
AIエージェントでのJava開発がはかどるMCPをAIを使って開発してみた / java mcp for jjug
kishida
4
600
高単価案件で働くための心構え
nullnull
0
130
予防に勝る防御なし(2025年版) - 堅牢なコードを導く様々な設計のヒント / Growing Reliable Code PHP Conference Fukuoka 2025
twada
PRO
36
12k
レイトレZ世代に捧ぐ、今からレイトレを始めるための小径
ichi_raven
0
320
Swift Concurrency 年表クイズ
omochi
3
230
アーキテクチャと考える迷子にならない開発者テスト
irof
7
2.8k
最新のDirectX12で使えるレイトレ周りの機能追加について
projectasura
0
220
CloudflareのSandbox SDKを試してみた
syumai
0
140
OSS開発者の憂鬱
yusukebe
12
4k
AIの弱点、やっぱりプログラミングは人間が(も)勉強しよう / YAPC AI and Programming
kishida
9
4.4k
퇴근 후 1억이 거래되는 서비스 만들기 | 내가 AI를 사용하는 방법
maryang
2
560
Featured
See All Featured
The Art of Programming - Codeland 2020
erikaheidi
56
14k
Practical Orchestrator
shlominoach
190
11k
4 Signs Your Business is Dying
shpigford
186
22k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
A better future with KSS
kneath
239
18k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.1k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.6k
Visualization
eitanlees
150
16k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.2k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
9
970
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
2.9k
What's in a price? How to price your products and services
michaelherold
246
12k
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)ͷݟ͕ஷ·Εߦ͚Δؾ͕͢Δ