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
アッテ開発の技術 : Golang と Google App Engine
Search
Tatsuya Tsuruoka
April 20, 2016
Programming
20
48k
アッテ開発の技術 : Golang と Google App Engine
2016年4月18日開催のアッテフェスでの発表です。
Tatsuya Tsuruoka
April 20, 2016
Tweet
Share
More Decks by Tatsuya Tsuruoka
See All by Tatsuya Tsuruoka
「メルカリ アッテ」を支える Google App Engine と Golang
ttsuruoka
18
12k
GoとGAEによるWebアプリケーション開発(Go Con 2016 Spring)
ttsuruoka
12
8.3k
メルカリの超高速開発を支えるPHP (PHPCon2014)
ttsuruoka
17
26k
メルカリ開発の歴史
ttsuruoka
2
2.1k
LT_有給とって温泉に行こう
ttsuruoka
0
240
Other Decks in Programming
See All in Programming
開発者への寄付をアプリ内課金として実装する時の気の使いどころ
ski
0
150
CSS Linter の現在地 2025年のベストプラクティスを探る
ryo_manba
9
2.9k
Navigation 2 を 3 に移行する(予定)ためにやったこと
yokomii
0
440
議事録の要点整理を自動化! サーバレス Bot 構築術
penpeen
3
1.5k
麻雀点数計算問題生成タスクから学ぶ Single Agentの限界と Agentic Workflowの底力
po3rin
5
1.9k
API Platform 4.2: Redefining API Development
soyuka
0
700
Pythonスレッドとは結局何なのか? CPython実装から見るNoGIL時代の変化
curekoshimizu
2
340
ABEMAモバイルアプリが Kotlin Multiplatformと歩んだ5年 ─ 導入と運用、成功と課題 / iOSDC 2025
akkyie
0
210
How Android Uses Data Structures Behind The Scenes
l2hyunwoo
1
540
メモリ不足との戦い〜大量データを扱うアプリでの実践例〜
kwzr
1
370
LLMとPlaywright/reg-suitを活用した jQueryリファクタリングの実際
kinocoboy2
4
560
ИИ-Агенты в каждый дом – Алексей Порядин, PythoNN
sobolevn
0
140
Featured
See All Featured
GraphQLとの向き合い方2022年版
quramy
49
14k
The Art of Programming - Codeland 2020
erikaheidi
56
13k
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
127
53k
Become a Pro
speakerdeck
PRO
29
5.5k
Product Roadmaps are Hard
iamctodd
PRO
54
11k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
23
1.5k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
Automating Front-end Workflow
addyosmani
1371
200k
Raft: Consensus for Rubyists
vanstee
139
7.1k
Being A Developer After 40
akosma
90
590k
GitHub's CSS Performance
jonrohan
1032
460k
Transcript
։ൃͷٕज़ 2016/04/18 (PMBOHͱ(PPHMF"QQ&OHJOF
ࣗݾհ 2 Ԭ ୡ • ικɺαʔόαΠυΤϯδχΞ݉ Ϛωʔδϟʔ • ϝϧΧϦɺۀ͔࣌ΒόοΫΤϯυͷ ΤϯδχΞϦϯάΛ୲
• ։ൃऀָ͕͘͠ࣄͰ͖ΔΛ࡞Δͷ ͕͖
ࠓճ͓͍͑ͨ͜͠ͱ 3 1. Go ͱ GAE ඇৗʹ༗ྗͳ Web ΞϓϦ։ൃखஈ 2.
PaaS ͷ͕࣌ຊ֨తʹ࢝·͖ͬͯͨ
INDEX Why Goʁ Why GAEʁ ࢄγεςϜͷͨΊͷ Datastore Web ΞϓϦέʔγϣϯͷΞʔΩςΫνϟ
Why Go? Why GAE? 5 • Ξοςͷ։ൃΛ GAE/Go ʹܾΊͨཧ༝ ΞϓϦέʔγϣϯͷཁ݅
ϝϧΧϦͰͳ͘ικ (PPHMFͷಈ͖ ϓϩμΫτ։ൃϑΥʔΧε
ΞϓϦέʔγϣϯͷཁ݅ 6 • ػೳతͳଆ໘ JSON APIɺ੩తίϯςϯπ৴ʢHTML/CSS/JSʣɺಈతίϯςϯπੜɺ σʔλϕʔε(ӬଓԽɺΫΤϦ)ɺΩϡʔॲཧɺ ݕࡧ(ΩʔɺશจݕࡧɺҐஔɺ༧ଌม)ɺ ը૾Ξοϓϩʔυͱ৴ɺϝʔϧૹ৴ɺPush ௨ɺσʔλੳ
ΞϓϦέʔγϣϯͷཁ݅ 7 • ඇػೳతͳଆ໘ • άϩʔόϧ • ෳϦʔδϣϯ(USɺEUɺAPAC)ͰαʔϏεΛల։͍ͨ͠ ͦͷͱ͖σʔλϕʔεάϩʔόϧʹͻͱ͚ͭͩ •
େنΞϓϦέʔγϣϯ • DAU ઍສਓنΛѻ͑ΔΞʔΩςΫνϟΛߟ͍͑ͨ • ࢀߟɿݱࡏͷϝϧΧϦ͕ถ3500ສμϯϩʔυɻ ϐʔΫ࣌ຖ120ສϦΫΤετɻѻ͏σʔλྔԯ୯Ґ • ϋΠεέʔϥϒϧ • ্ཱͪ͛ظ͔ؒΒ࠷ޙ·ͰҰ؏ͨ͠ΞʔΩςΫνϟʹ͍ͨ͠
ϝϧΧϦͰͳ͘ικ 8 • େͳٕज़બఆ͕Ͱ͖ͨେ͖ͳཧ༝ͷͻͱͭ • ϝϧΧϦͷࢠձࣾͱ্ཱ͕ͯͪͬͨ͠ܦҢ͕͋Γɺ ಉٕ͡ज़Λ͋͑ͯબͳ͍ͱ͍͏બࢶߟ͑ͯΈΔ • ϝϧΧϦͷLAMPελοΫͰͳ͍ͱͨ͠ΒɺͲΜͳબࢶʹͳΔʁ
ϝϧΧϦͰͳ͘ικ 9 • ϓϩμΫτͷϦϦʔε͢ ͯʹ༏ઌ͞ΕΔ • ݶΒΕͨϦιʔε ʢਓɺ͓ۚɺ࣌ؒʣ • ͍·ूΊΒΕΔՄೳੑͷߴ
͍ΤϯδχΞʁ • → อकతʹˍݎ࿚ʹ • ϝϧΧϦ͚ͩͰੜΈग़ͤ ͳ͍৽͍͠ՁΛग़͍ͨ͠ • ५ͳϦιʔε • 3ޙʹΤϯδχΞʹͱͬ ͯັྗతͳॴͰ͋ΔͨΊ ʹʁ • → ଟ༷ੑͱٕज़ͷ։ ϝϧΧϦॳظ ικ
Google ͷಈ͖ 10 • ΞοςͷΠϯϑϥΛߟ͑Δͱ͖ʹɺϝϧΧϦͱಉ͡ΦϯϓϨϛεAWSҎ֎ ͷબࢶௐࠪ • Google Cloud Platform
Ͱྑ͍ՌΛग़ͤͨͱ͍͏ใΛಘͨɻ͙͢ʹ Google ͷ୲ऀΛհͯ͠Β͍ɺGCP/GAE ͷ࠾༻ՄೳੑΛ1ϲ݄΄Ͳݕূ • Google ʹΑΔ͖Ίࡉ͔ͳαϙʔτମ੍ • 5͘Β͍લͱ༷ࢠ͕ҧ͏ • AWS ͕ຊϦʔδϣϯΛग़͖ͯͨ͠ͱ͖ͷΑ͏ͳงғؾ͕͋ͬͨ • Google Cloud Platform ʹରͯ͠ඇৗʹଟ͘ͷϦιʔεΛԼ͍ͯ͠Δ
ϓϩμΫτ։ൃϑΥʔΧε 11 • ΤϯδχΞͷଟ͕͘ ։ൃݴޠΠϯϑϥಛ༗ͷʹ࣌ؒΛ͏ͷͰͳ͘ɺ ϓϩμΫτͷ։ൃʹूதͰ͖Δڥ͕ཧɺͱ͍͏؍
ϓϩμΫτ։ൃϑΥʔΧε - Golang 12 • Go ͷੜ࢈ੑύϑΥʔϚϯεʁ • ϝϧΧϦͰ GaurunʢPush
৴ϛυϧΣΞʣͳͲͷ࣮͕͋Γɺ Go ͷϙςϯγϟϧͷߴ͞ײ͍ͯͨ͡ • ݕূϙΠϯτɿϛυϧΣΞ͚ͩͰͳ͘ Web Ͱߴ͍ੜ࢈ੑΛग़ͤΔ͔ • LL ͱҧ͏ੜ࢈ੑͷग़͠ํ͕Ͱ͖Δ • ॳॻࣺͯͷૣ͞ LL ʹྼΓ͕ͪɻ͍ͰݟΕੜ࢈ੑߴ͘ײ͡ ͨɻݫ֨ͳܕγεςϜ͕͋ΔͷͰେͳมߋ҆৺ͯ͠Ͱ͖Δ • νʔϜ։ൃͷ͢͠͞ • go fmtɺgo doc
ϓϩμΫτ։ൃϑΥʔΧε - GAE 13 • 1ͭͷ GCP ϓϩδΣΫτʹ 1ͭͷ App
Engine • App Engine ͷதʹΞϓϦέʔγϣϯ ͕Քಇ͢ΔΠϯελϯε͕͋Δ • ݕࡧػೳΩϡʔఏڙ͞ΕΔ • σʔλϕʔε Datastore • σʔλੳ BigQuery • ଞʹଟͷػೳ͕͋Γɺ App Engine ͱ࿈ܞͰ͖Δ プロジェクト App Engine App Engine Datastore Instances Search BigQuery Task Queue - GCE - Logs etc. - Networks
ϓϩμΫτ։ൃϑΥʔΧε - GAE 14 • Ϟδϡʔϧͱόʔδϣϯ • ΞϓϦέʔγϣϯΛෳͷڥʹσϓϩΠͰ͖Δ = όʔδϣϯͱݺΕΔ
• όʔδϣϯʹରͯ͠τϥϑΟοΫͷৼΓ͚ΛઃఆͰ͖Δ • ཧతͳ Blue / Green σϓϩΠ ग़యɿIUUQTDMPVEHPPHMFDPNTPMVUJPOTNJDSPTFSWJDFTPOBQQFOHJOF
ཧతͳ Blue/Green σϓϩΠ 15
ϓϩμΫτ։ൃϑΥʔΧε - GAE 16 • ΠϯελϯεͷΦʔτεέʔϧ • App Engine ʹΞϓϦέʔγϣϯΛσϓϩΠ͢Δ͚ͩͰΦʔτεέʔϧ͢Δ
• ΞΫηε͕ͳ͚ΕΠϯελϯε্ཱ͕ͪΒͣɺ ΞΫηε͕͋ͬͨͱ͖ʹ্ཱ͕ͪΔ • Πϯελϯε VM Ͱͳܰ͘ྔίϯςφ • Go ͷΠϯελϯεͳΒىಈ200msҎԼ • طଘΞϓϦ͔Βͷྲྀ͜͠ΈେنͳࠂϓϩϞʔγϣϯͰɺ Կ͠ͳͯ͘ॠ࣌ʹΠϯελϯε͕૿͑ͯॲཧ͞ΕΔ
GAE ͷΦʔτεέʔϧ 17
౷߹͞Ε͍ͯΔϦΞϧλΠϜͷϩάػೳ 18
౷߹͞Ε͍ͯΔϦΞϧλΠϜͷϩάػೳ - τϨʔε 19
ࢄγεςϜͷͨΊͷ%BUBTUPSF
ӬଓԽσʔλΛͲ͏ͬͯεέʔϧͤ͞Δ͔ 21 • Ҋ1) RDB ʹΑΔ౷తͳ Master/Slave Ϟσϧ • ࣮ेͰཱ֬͞Εͨख๏
• ͱ͍͑ DB Λθϩ͔Β্ཱͪ͛ͯεέʔϧ͍ͤͯ͘͞ͷେม • େنͳσʔλʹͳΔ΄Ͳ RDB ຊདྷͷ࣋ͪຯੜ͔ͤͳ͘ͳΔ • ҟͳΔ DB ςʔϒϧͱͷτϥϯβΫγϣϯ͕Ͱ͖ͳ͍ɻJOIN ͕ݶఆత • Ϣʔβͷ্ݶ͕Θ͔͍ͬͯΔ߹͜ΕͰ OK • → GCP Ͱ Cloud SQL ͕ఏڙ͞Ε͍ͯΔ
ӬଓԽσʔλΛͲ͏ͬͯεέʔϧͤ͞Δ͔ 22 • Ҋ2) εέʔϥϏϦςΟΛॏࢹͨ͠ NoSQL Ϟσϧ • NoSQL σʔλϕʔε
"Datastore" • τϨʔυΦϑɿ • ࣮༻తͳ ACID ͖͋ΒΊΔ • ۃΊͯߴ͍εέʔϥϏϦςΟ
RDB ͱ NoSQL ͲͪΒΛબͿ͖͔ʁ 23 • ؒҧ͍ͳ͘ɺGAE ͷσʔλϕʔεʹ Datastore ΛબͿ͖
• Gmail YouTube ͷΑ͏ͳαʔϏεͷσʔλ RDB Ͱͳ͘ BigTable ʹอଘ͞Ε͍ͯΔ • NoSQL ͷ࣮ Google ͕࣮ূࡁΈ • ΞοςͪΖΜ RDB ΛΘͣ Datastore Λར༻ • ͍͜ͱ׳Ε͠ΜͰ͖ͨ RDB Ͱͳ͘ɺNoSQL ΛબͿܾஅ͍͠ • ͔͠͠άϩʔόϧϨϕϧͷେنαʔϏεΛ࡞ΔͨΊʹ NoSQL ΛબͿܾஅΛ͠Α͏
Datastore ͷಛ 24 • ΦϒδΣΫτߏΛ࣋ͭεΩʔϚϨεͳ Key-Value Store ʹ ୯७ͳΫΤϦʹΑΔݕࡧΛՃ͑ͨͷ •
BigTable ͷ্ʹߏங͞Ε͍ͯΔ • BigTable ୯७ͳ KVSʢΩʔΛݩʹͨ͠ߦ୯Ґͷ CRUD + Ωʔͷൣғݕࡧʣ
Datastore ͷಛ 25 • Pros • ۃΊͯߴ͍εέʔϥϏϦςΟ • ӬଓԽͰ͖ΔσʔλʢΤϯςΟςΟʣͷʹ੍ݶͳ͍ •
ӬଓԽσʔλ͕ͲΕ͚ͩ૿͑ͯऔಘͱՃͷྼԽ͠ͳ͍ • 1݅Ͱ10ԯ݅Ͱಉ͡ • ಉҰΤϯςΟςΟͰͳ͚Ε੍ݶͳ͠ͷฒྻॻ͖ࠐΈ • ۃΊͯߴ͍Մ༻ੑ • μϯλΠϜͳ͠ • Cons • BigTable ΑΓߴػೳͱ͍͑ϓϦϛςΟϒ • ݶఆ͞Εͨ݅Ͱ͔͠ ACID τϥϯβΫγϣϯ͕αϙʔτ͞Εͳ͍ • JOIN ͕ͳ͍ɺू͕ؔͳ͍ɺetc.
Datastore Λ͏ͱ͖ʹߟ͑Δ͜ͱ 26 • RDB ͷύλʔϯΛͦͷ··ͯΊΔ͜ͱͰ͖ͳ͍ • ྫ1) τϥϯβΫγϣϯͳ͠ͰෳͷΛҰ؏ੑΛ࣋ͨͤͯߋ৽ •
→ Ұ࣌తʹҰ؏ੑ͕ͳ͘ͳΔ͜ͱΛڐ༰͢Δ • ྫ2) ΦʔτΠϯΫϦϝϯτʢ୯ௐ૿Ճ͢Δͷ࠾൪ʣ • → Datastore ͷػೳ͚ͩͰεέʔϧ͢Δ࠾൪࣮Ͱ͖ͳ͍ • ࢄγεςϜͰͷΦʔτΠϯΫϦϝϯτͷߟ͑ํ͕ඞཁ
8FCΞϓϦέʔγϣϯͷΞʔΩςΫνϟ
Web ΞϓϦέʔγϣϯͷΞʔΩςΫνϟ 28 • Go Ͱ Web ΞϓϦΛ࡞Δ͜ͱͰ͖Δʁ → Ͱ͖Δ
• ͲΜͳϑϨʔϜϫʔΫΛ͏ʁ → net/http? • ੜ࢈ੑʁ → ʁʁʁ Α͘ฉ͔ΕΔ͜ͱ
ΞοςͷΞʔΩςΫνϟ 29 • ΞϓϦέʔγϣϯෳݸͷϞδϡʔϧͰߏ͞ΕΔ • APIɺWebɺCS toolɺetc. • Ϟδϡʔϧͦͷ··σϓϩΠ୯Ґ •
୯ҰͷϦϙδτϦ(monorepo)Ͱɺଟ͘ͷίʔυڞ௨ • API JSON RPC 2.0 • Web ͱ CS tool HTML Λಈతੜ͢Δ • ΞϓϦέʔγϣϯɺυϝΠϯɺUIɺΠϯϑϥͷ4ʹ͔Ε͍ͯͯɺ ֤Ϟδϡʔϧ UI ͷҧ͍ͱͯ͠දݱ͍ͯ͠Δ
ΞοςͷΞϓϦέʔγϣϯͷઃܭํ 30 • GAE ͷґଘ • GAE ͷػೳΛϑϧʹ׆༻͢Δ͜ͱͰεέʔϥϏϦςΟՄ༻ੑͷԸܙΛड ͚͍ͯΔ •
વɺڧྗʹϩοΫΠϯ͞ΕΔ͜ͱʹͳΔ • ͔͞͞ͳ߅ɿυϝΠϯʢϏδωεϩδοΫʣͱΠϯϑϥΛ͚ ͯɺυϝΠϯΛ GAE ʹґଘ͠ͳ͍Α͏ʹ͍ͯ͠Δ • Datastore Λར༻͢Δ Repository Λ AWS ͷ DynamoDB Λར༻͢Δ Repository ʹࠩ͠ସ͑Α͏ͱࢥ͑Ͱ͖Δ
ΞοςͷΞϓϦέʔγϣϯͷઃܭํ 31 • Go ͷߟ͑ํʹै͏ • ίʔυͷॻ͖ํͷΑ͏ͳࡉ͔͍͜ͱ • ύοέʔδΛͲ͏ཧ͢Δ͔ •
ॏްͳϑϨʔϜϫʔΫΛಋೖ͠ͳ͍ • x/net/context ͱ net/http ύοέʔδ • 1ͭͷϦϙδτϦʹͯ͢ΛೖΕΔʢmonorepoʣ • APIɺWebɺCStool ͷΑ͏ͳڥք͕ҟͳΓͦ͏ͳϓϩδΣΫτΛɺ୯Ұϓ ϩδΣΫτͱͯ͠ѻ͏ • ڞ௨෦Λѻ͍͘͢ͳͬͯɺґଘؔཧ؆୯ʹͳΔ • ԣஅతͳίʔυͷվमΛ͘͢͠ͳΔ
·ͱΊ 32 1. Go ͱ GAE ඇৗʹ༗ྗͳ Web ΞϓϦ։ൃखஈ 2.
PaaS ͷ͕࣌ຊ֨తʹ࢝·͖ͬͯͨ → ͥͻ GAE/Go Λମݧͯ͠Έ͍ͯͩ͘͞