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.1k
メルカリの超高速開発を支えるPHP (PHPCon2014)
ttsuruoka
17
25k
メルカリ開発の歴史
ttsuruoka
2
1.9k
LT_有給とって温泉に行こう
ttsuruoka
0
220
Other Decks in Programming
See All in Programming
サイコロで理解する統計的仮説検定の考え方
tatamiya
4
930
Scalable Customer Journey Orchestration (CJO)
lewuathe
0
240
[技育CAMPアカデミア]アイディアを形に!【超入門】スマホアプリ開発〜リリースまでの流れをご紹介
teamlab
PRO
0
370
HUIT新歓2024「競技プログラミング、やってみませんか?」
slephy2784
1
270
⼤規模⾔語モデルの拡張(RAG)が 終わったかも知れない件について
nearme_tech
23
15k
Behind VS Code Extensions for JavaScript / TypeScript Linnting and Formatting
unvalley
5
910
PHPはいつから死んでいるかの調査
chiroruxx
1
400
2 週間で Twitter Bot を作ってみた
contour_gara
0
370
SwiftUIで使いやすいToastの作り方 / How to build a Toast system which is easy to use in SwiftUI
lovee
3
140
Zero Waste, Radical Magic, and Italian Graft – Quarkus Efficiency Secrets
hollycummins
0
230
What We Can Learn From OSS
inouehi
0
420
エンターテイメント業界で利用されるAWS
demuyan
0
210
Featured
See All Featured
Fireside Chat
paigeccino
21
2.6k
Teambox: Starting and Learning
jrom
128
8.4k
Statistics for Hackers
jakevdp
789
220k
Raft: Consensus for Rubyists
vanstee
132
6.3k
Bash Introduction
62gerente
604
210k
10 Git Anti Patterns You Should be Aware of
lemiorhan
648
58k
Large-scale JavaScript Application Architecture
addyosmani
504
110k
Bootstrapping a Software Product
garrettdimon
PRO
302
110k
Designing for humans not robots
tammielis
248
25k
Done Done
chrislema
178
15k
Intergalactic Javascript Robots from Outer Space
tanoku
266
26k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
21
1.6k
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 Λମݧͯ͠Έ͍ͯͩ͘͞