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
「メルカリ アッテ」を支える Google App Engine と Golang
Search
Tatsuya Tsuruoka
June 08, 2016
Programming
18
12k
「メルカリ アッテ」を支える Google App Engine と Golang
2016年6月8日の appengine ja night #33 の発表資料です。
Tatsuya Tsuruoka
June 08, 2016
Tweet
Share
More Decks by Tatsuya Tsuruoka
See All by Tatsuya Tsuruoka
GoとGAEによるWebアプリケーション開発(Go Con 2016 Spring)
ttsuruoka
12
8.2k
アッテ開発の技術 : Golang と Google App Engine
ttsuruoka
20
48k
メルカリの超高速開発を支えるPHP (PHPCon2014)
ttsuruoka
17
25k
メルカリ開発の歴史
ttsuruoka
2
2k
LT_有給とって温泉に行こう
ttsuruoka
0
230
Other Decks in Programming
See All in Programming
テストコード文化を0から作り、変化し続けた組織
kazatohiei
2
1.5k
Cloudflare MCP ServerでClaude Desktop からWeb APIを構築
kutakutat
1
530
わたしの星のままで一番星になる ~ 出産を機にSIerからEC事業会社に転職した話 ~
kimura_m_29
0
180
Scalaから始めるOpenFeature入門 / Scalaわいわい勉強会 #4
arthur1
1
300
【re:Growth 2024】 Aurora DSQL をちゃんと話します!
maroon1st
0
770
これが俺の”自分戦略” プロセスを楽しんでいこう! - Developers CAREER Boost 2024
niftycorp
PRO
0
190
バグを見つけた?それAppleに直してもらおう!
uetyo
0
170
今年のアップデートで振り返るCDKセキュリティのシフトレフト/2024-cdk-security-shift-left
tomoki10
0
190
これでLambdaが不要に?!Step FunctionsのJSONata対応について
iwatatomoya
2
3.6k
Discord Bot with AI -for English learners-
xin9le
1
120
Go の GC の不得意な部分を克服したい
taiyow
2
760
[JAWS-UG横浜 #76] イケてるアップデートを宇宙いち早く紹介するよ!
maroon1st
0
450
Featured
See All Featured
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
8
1.2k
Mobile First: as difficult as doing things right
swwweet
222
9k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
Why Our Code Smells
bkeepers
PRO
335
57k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Visualization
eitanlees
146
15k
GitHub's CSS Performance
jonrohan
1030
460k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
38
1.9k
Facilitating Awesome Meetings
lara
50
6.1k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
44
9.3k
How to Ace a Technical Interview
jacobian
276
23k
Become a Pro
speakerdeck
PRO
26
5k
Transcript
ʮϝϧΧϦΞοςʯΛࢧ͑Δ 2016/06/08 (PPHMF"QQ&OHJOFͱ(PMBOH
ࣗݾհ 2 Ԭ ୡ • ικ & ϝϧΧϦ • ۀ࣌ͷόοΫΤϯυͷΤϯδχΞϦϯάͱ
։ൃνʔϜͷϚωʔδϝϯτΛ୲ • νʔϜָ͕͘͠ࣄͰ͖ΔΛ࡞Δͷ͕͖
֓ཁ 3 1. ৽ن Web αʔϏεͷΠϯϑϥڥͱͯ͠ GAE/Go Λ࠾༻ͨ͠ͷͳ͔ͥ 2.
GAE/Go ʹΑΔ։ൃͱӡ༻ͲͷΑ͏ͳͷͳͷ͔ɻ ੜ࢈ੑɺεέʔϥϏϦςΟͱύϑΥʔϚϯεɺՄ༻ੑɺ αϙʔτମ੍ɺίετɺଞͷΠϯϑϥڥͱൺֱͯ͠ Ͳ͏͔ͩͬͨ
("&(P࠾༻ͷཧ༝
GAE/Go ࠾༻ͷཧ༝ 5 • ཧ༝1 : GAE ͷεέʔϥϒϧͳࢄγεςϜͷΈ • ཧ༝2
: GCP Γ্͕Γͷஹ͠ͱকདྷͷՄೳੑ • ཧ༝3 : νʔϜ։ൃʹ͍͍ͯΔ GolangɻGAE ʹΑΔਖ਼ࣜରԠ
GAE/Go ࠾༻ͷཧ༝1 : εέʔϥϒϧͳ GAE 6 • લఏɿ৽نࣄۀΞοςͷΠϯϑϥཁ݅ • άϩʔόϧ
• ෳϦʔδϣϯʢUSɺEUɺAPACʣͰαʔϏεΛల։͍ͨ͠ • ڞ௨ͷίʔυ & ͻͱͭͷσʔλϕʔε • େنΞϓϦέʔγϣϯ • DAUઍສਓنɻॠؒతͳΞΫηεສϦΫΤετ/ඵ • ϋΠεέʔϥϒϧ • ػೳվम࣌ͳͲʹαʔϏεແఀࢭʹ͍ͨ͠ • εέʔϧͷͨΊͷ४උ࡞ۀΛͳ͍ͨ͘͠
GAE/Go ࠾༻ͷཧ༝1 : εέʔϥϒϧͳ GAE 7 • Α͋͘ΔΞϓϩʔνͰɺ͏·͍͘͘ͷɿ • ҊA
: աڈʹܦݧͷ͋ΔߏطଘͷΠϯϑϥΛ͏ • ҊB : ৽نઃܭɻকདྷతʹඞཁʹԠͯ͡ઃܭΛੈަͤ͞Δ • → ϝϧΧϦͷͱ͖ҊBɻϦϦʔεޙ3ϲ݄ͰेສϢʔβͱ͍͏ఆΛ͠ ͯɺߴੑೳઐ༻αʔό1ͰߏஙɻߏΛੈަͤ͞Δ͜ͱͰεέʔϧ͞ ͍ͤͯͬͨ • ࠓճͷ৽نࣄۀͷΠϯϑϥཁ݅ϋʔυϧ͕ߴ͘ɺҊAɺҊB ͲͪΒͷΞϓ ϩʔν͏·͋ͯ͘·Βͳ͔ͬͨ
GAE/Go ࠾༻ͷཧ༝1 : εέʔϥϒϧͳ GAE 8 • ผͷΞϓϩʔνɺPaaS ʹ͍ͭͯߟ͑ͯΈΔ •
GAE Ҏ֎ͷ PaaS ʁ • AWS ্ʹߏஙͯ͠ఏڙ͞Ε͍ͯΔ PaaS AWSʢIaaSʣͷ੍Λड͚ͯ ͠·͏ • PaaS ΛӡӦ͍ͯ͠Δاۀͷن͕খ͍͞߹ɺͦ͜ʹΠϯϑϥΛ༬͚Δͱ ϦεΫΛίϯτϩʔϧͮ͠Β͍ • Microsoft Azure Force.com ɺࠓճͷ։ൃཁ݅ʹ߹Θͳ͍
GAE/Go ࠾༻ͷཧ༝1 : εέʔϥϒϧͳ GAE 9 • GAE → ཁ݅ΛຬͨͤΔ
• άϩʔόϧ • US ͔Βੈք͚ʹଟ͘ͷαʔϏε͕ల։͞Ε͍ͯΔ • Google ͱΠϯϑϥΛڞ༻͍ͯ͠Δ GAE વάϩʔόϧରԠ • େنΞϓϦέʔγϣϯ • Snapchat ͷΑ͏ͳDAU1ԯਓنͷࣄྫ • ϋΠεέʔϥϒϧ • ࢄγεςϜΛ࡞ΔͨΊͷΈ͕͍ͬͯΔ • খ͞ͳن͔Βେ͖ͳن·Ͱઢܗʹεέʔϧ
GAE/Go ࠾༻ͷཧ༝2 : GCP Γ্͕Γͷஹ͠ 10 • ཧ༝2 : GCP
Γ্͕Γͷஹ͠ͱকདྷͷՄೳੑ • 20159݄ࠒɺ৽نࣄۀͷٕज़બఆΛ࢝͠Ίͨͱ͖ʹɺ͢Ͱʹ GCP(GKE) Λ ͬͯ։ൃΛ͍ͯͨ͠ΤϯδχΞ͔ΒʮGCP ͕ඇৗʹྑ͔ͬͨʯͱ͍͏Λ ฉ͍ͨ • ͦΕ·Ͱ BigQuery GCE ͘Β͍͔͠৮͍ͬͯͳ͔ͬͨͷͰɺใऩूΛ։ ࢝ɻGoogle ͷ୲ऀΛհͯ͠Β͍ɺ͙͢ʹ࠷৽ͷ GCP ใΛڭ͑ͯ Β͏ • → AWS ͷιϦϡʔγϣϯΞʔΩςΫτͷΑ͏ͳͤΔٕज़୲ऀ͕͍ Δ͜ͱʹ·ͣڻ͍ͨ
GAE/Go ࠾༻ͷཧ༝2 : GCP Γ্͕Γͷஹ͠ 11 • ࠓͰͦ͜ීٴ͍ͯ͠Δ AWS ౦ژϦʔδϣϯ͕ͳ͍͜Ζٕज़୲ऀ͍ͳ
ͯ͘ɺΦϯϥΠϯυΩϡϝϯτΛཔΔ͔͠ͳ͔ͬͨ • ۙ·Ͱ GCP ͦ͏͍͏ঢ়ଶʹͳ͍ͬͯΔͱࢥ͍ͬͯͨ → ͤΔ୲ऀ͕͍ͯɺGCP ʹؔ͢Δٙʹਝˍత֬ʹճΛΒ ͑Δঢ়ଶ • ͞ΒʹΦϯϥΠϯ্ͰɺGoogle ʹΑΔ GCP ͷใΞοϓσʔτසߴ ·͍ͬͯΔ • → Google ͕ GCP ʹରͯ͠ଟ͘ͷϦιʔεΛׂ͍͍ͯΔ͜ͱ͕Θ͔ͬͨɻ αʔϏεΛͷͤΔΠϯϑϥͱͯ͠ेʹ҆શͱஅ
GAE/Go ࠾༻ͷཧ༝3 : Golang αϙʔτ 12 • ࠷ॳʹ Golang ʹ͍ͭͯݕ౼͢ΔΑ͏ʹͳ͖͔͚ͬͨͬɿ
࠾༻ձ৯ʹ͔͏λΫγʔͷத… ࢁాʮ࣍Ͳ͏͍͏ݴޠͰ࡞Δʁʯ ʮϝϧΧϦͱಉ͡ PHP Ͱ͢Ͷʯ ࢁాʮGo ͬͯͲ͏͔ͳʁʯ ʮྑ͍ݴޠͰ͢ͶɻͨͩࠓճPHPͰ࣮֬ʹ࡞Ζ͏ͱࢥ͍·͢ʯ ʢͦͷޙ Golang ʹ͍͍ͭͯΖ͍ΖใΛूΊΔʣ
GAE/Go ࠾༻ͷཧ༝3 : Golang αϙʔτ 13 • Golang ͱ Web
αʔϏε։ൃͷ૬ੑ • CLI ͳͲγεςϜϓϩάϥϛϯάಘҙͳྖҬͱͯ͘͠ΒΕ͍ͯΔ • → ϝϧΧϦࣾͰଟͷ࣮͋Δ Go ϓϩμΫτ͕͋Γɺੜ࢈ੑͷߴ ͞ೝ͍ࣝͯͨ͠ • ࣮ࡍʹ৮ΔͱɺWeb αʔϏε։ൃʹ͓͍ͯඇৗʹڧྗͳ͜ͱ͕Θ͔ͬͯ ͖ͨ • ݴޠࣗମͷಛɿ੩తܕ͚ɺγϯϓϧͳߏจɺgo fmt/doc ͳͲ • ύοέʔδ/ϥΠϒϥϦͷےͷྑ͞ɿnet/http x/net/context • GAE Golang ͷਖ਼ࣜରԠ͕ൃද͞Ε͍ͯͨʢ20157݄ʣ
GAE/Go ࠾༻ͷཧ༝3 : Golang αϙʔτ 14 • ཧ༝1 : GAE
ͷεέʔϥϒϧͳࢄγεςϜͷΈ • ཧ༝2 : GCP Γ্͕Γͷஹ͠ͱকདྷͷՄೳੑ • ཧ༝3 : νʔϜ։ൃʹ͍͍ͯΔ GolangɻGAE ʹΑΔਖ਼ࣜରԠ → ͜ΕΒͷཧ༝Ͱικࣾ GAE/Go ʹܾఆɻ ϝϧΧϦʹର͢Δικͷٕज़తͳҐஔ͚͕ͮϋοΩϦͯ͠ɺ ޙʹͲ͏ͳ͍ͬͯΔ͔૾Ͱ͖ͨͷͰ໎͍ͳܾ͘ఆͰ͖ͨ
("&(P࠾༻ͷ݁Ռ
GAE/Go ࠾༻ͷ݁Ռ 16 • ݁Ռ1 : ੜ࢈ੑ • ݁Ռ2 :
εέʔϥϏϦςΟͱύϑΥʔϚϯε • ݁Ռ3 : Մ༻ੑ • ݁Ռ4 : αϙʔτମ੍ • ݁Ռ5 : ίετ
GAE/Go ࠾༻ͷ݁Ռ1 : ੜ࢈ੑ 17 • ͲΕ͚ͩૉΒ͍͠ͱݴΘΕΔΠϯϑϥ։ൃݴޠͰ͋ͬͯɺ ͔ͦ͜ΒϓϩμΫτ͕ϦϦʔε͞Εͳ͚Εɺҙຯ͕ͳ͍ • ࠓճɺGAE/Go
Λࣗ৴Λ࣋ͬͯબͨ͠ͷͷɺ͜ͷٕज़͕ੈؒ ҰൠͰීٴ͍ͯ͘͠ͷͳͷ͔Α͘ݟۃΊΔඞཁ͕͋ͬͨ • →ʮΞοςʯͷόοΫΤϯυͷ։ൃશһ͕ GAE Golang ະܦݧ͔Β࢝·͍ͬͯΔɻࣾͷৄ͍͠ਓʹ(ҙਤతʹ)૬ஊͤ ͣʹ։ൃ
GAE/Go ࠾༻ͷ݁Ռ1 : ੜ࢈ੑ 18 • ࣮ࡍʹͲ͏͔ͩͬͨɿ • ։ൃணख͔Β2ϲ݄ʹݶఆެ։όʔδϣϯΛϦϦʔεɻ5ϲ݄ ʹਖ਼ࣜ൛ϦϦʔε
• ະܦݧ͔Β࢝·ͬͯԿΒ͔ͷΠϯϑϥͱ։ൃݴޠΛѻ͑ΔΤ ϯδχΞͰ͋Εɺ͙͢ʹϓϩμΫτͷ։ൃʹՃΘΕΔ • → ೖࣾͯ͠1िؒҎʹຊ൪ڥͰಈ͘ίʔυΛॻ͍ͯߩݙɻ 1ϲ݄ʹपғͷίʔυͱḮ৭ͳ͍Ϩϕϧ • ݁Ռ1: ੜ࢈ੑ → ˕ྑ͍
GAE/Go ࠾༻ͷ݁Ռ2 : εέʔϥϏϦςΟͱύϑΥʔϚϯε 19 • ݁Ռ2 : εέʔϥϏϦςΟͱύϑΥʔϚϯε •
GAE ͷΞϓϦɺਖ਼͘͠ઃܭ࣮ͯͨ࣌͠͠Ͱෛՙରࡦ͕ྃ ͍ͯ͠Δ → ྫɿϝοηʔδػೳɻDatastore ʹهͯ͠औಘ͢Δ͚ͩɻ Ϣʔβ͕ͲΕ͚ͩ૿͑ͯϝοηʔδྲྀ௨݅ಡΈऔΓճ͕૿ ͑ͯԿ͠ͳͯ͘ OK
GAE/Go ࠾༻ͷ݁Ռ2 : εέʔϥϏϦςΟͱύϑΥʔϚϯε 20 • ΞοςͰ࣮ࡍʹ͋ͬͨෛՙɿ • ϝϧΧϦͷΞϓϦ্ͷόφʔ͔ΒΞοςͷ༠ಋ •
→ ҰॠͰ App Store ϥϯΩϯά্Ґ • ेສʙඦສ݅ͷ Push ௨ͷҰ੪৴ • → ॠؒతʹΞΫηε͕ेഒʹ • ͜ΕΒͷෛՙ GAE/Go ্ͰαʔϏε͕ಈ͍͍ͯΔ࣌ͰࣗಈͰ εέʔϧͯ͠ରԠͰ͖Δ
GAE/Go ࠾༻ͷ݁Ռ2 : εέʔϥϏϦςΟͱύϑΥʔϚϯε 21 • ϓϩϏδϣχϯάΥʔϜΞοϓෆཁ • ϓϩϞʔγϣϯνʔϜͱΤϯδχΞ͕ࣄલʹෛՙʹ͍ͭͯଧͪ ߹ΘͤΔඞཁͳ͠
• 1Ϣʔβͷͱ͖ʹਖ਼͘͠ಈ͍͍ͯΕɺԿઍສϢʔβʹͳͬͯ ͳ͠ ※ಛఆͷΩʔʹର͢Δߋ৽ॲཧ͕େྔൃੜ͢Δͱ͖ͳͲɺྫ֎͋Γ
GAE/Go ࠾༻ͷ݁Ռ2 : εέʔϥϏϦςΟͱύϑΥʔϚϯε 22 • ͜ͷεέʔϥϏϦςΟ Golang ͷύϑΥʔϚϯεʹΑ࣮ͬͯݱ͞ Ε͍ͯΔ
• GAE ͷΠϯελϯε • Golang ͷ߹ɺेms Ͱىಈ͢Δ • ΞΫηε͕͋Ε૿͑ͯɺͳ͚ΕݮΔ → ΞΫηε͕͋Δͱ͖ʹॠ࣌ʹىಈ͢ΔͷͰΥʔϜΞοϓෆཁ • ݁Ռ2: εέʔϥϏϦςΟͱύϑΥʔϚϯε → ˕ྑ͍
GAE/Go ࠾༻ͷ݁Ռ3 : Մ༻ੑ 23 • ݁Ռ3 : Մ༻ੑ •
Ξος 100% Քಇத → ·ͩӡ༻ظ͕͍ؒͨΊਖ਼֬ͳධՁͰ͖ͳ͍ • ϝϧΧϦͷաڈͷΠϯϑϥϐʔΫλΠϜʹͳΔͱμϯ͢Δ͜ͱ ͕Α͋ͬͨ͘ͷͰɺࣾͷඪઃఆʹՔಇΛೖΕ͍ͯͨ • Ξος100%αʔϏεఏڙͰ͖Δ͜ͱ͕લఏͳͷͰඪઃఆ͠ ͍ͯͳ͍
GAE/Go ࠾༻ͷ݁Ռ3 : Մ༻ੑ 24 • ϝϯςφϯεܭըఀࢭʁ →ΞοςͰϝϯςφϯεܭըఀࢭ༧ఆ͍ͯ͠ͳ͍ɻྫ͑ DB ʹΧϥϜΛՃ͢ΔͨΊʹαʔϏεΛࢭΊͨΓ͠ͳ͍
• GAE + Datastore Ͱ͋Ε؆୯ʹආ͚ΒΕΔ • ͍ͭͰ͑ΔαʔϏεʹ͢ΔͨΊʹɺଟେͳ࿑ྗΛ͍ͬͯΔΘ ͚Ͱͳ͍͕େࣄ • GAE Datastore ͷಛੑʹ߹Θͤͯ࡞Εɺͦ͏ͳΔ • ݁Ռ3: Մ༻ੑ → ˕ྑ͍
GAE/Go ࠾༻ͷ݁Ռ4 : αϙʔτମ੍ 25 • ݁Ռ4 : αϙʔτମ੍ •
ࣄલʹใΛूΊͯαϙʔτମ੍ʹ͍ͭͯΑ͘Θ͔Βͳ͔ͬͨ ͷͰɺݸਓతʹҰ൪ݒ೦ͩͬͨ • Google ͞ΜͱͷϛʔςΟϯάΛ܁Γฦͨ͠ΓɺGCP ͷ༗ঈαϙʔ τʢGoldϓϥϯʣʹೖΔ͜ͱͰɺॆ࣮ͨ͠ମ੍͕ݟ͖͑ͯͨ
GAE/Go ࠾༻ͷ݁Ռ4 : αϙʔτମ੍ 26 • ϝϧΧϦͷͷརɿಉ͡Ϗϧʹ Google ͞Μ͕͍ΔͷͰɺࠔͬͨͱ ͖ʹ͙͢ʹͯ͠ใަͰ͖Δ
→ Ӧۀ୲ऀٕज़୲ऀ͕ͨ͘͞Μ͍ΔͷͰɺଞͷϏϧͷօ͞ ·΄΅ಉ༷ͷαϙʔτड͚ΒΕΔ(ͣ) • GCP ͷ༗ঈαϙʔτɺߴͳٕज़తͳ࣭ʹରͯ͠1࣍ճ ʹདྷͨΓɺͯ͘2Ҏʹ͕ղܾ͢Δ • ଞͷબࢶɿτοϓήʔτ͞ΜͷΑ͏ͳ GCP ύʔτφʔاۀ • ݁Ռ4: αϙʔτମ੍ → ˕ྑ͍
GAE/Go ࠾༻ͷ݁Ռ5 : ίετ 27 • ݁Ռ5 : ίετ •
աڈʹར༻ྉ͕ۚߴֹͩͬͨΛฉ͍ͨΓ͢Δ • աڈҰ୴Εͯɺ͍·͏ͱͲ͏͍͏ֹۚʹͳΔͷ͔ΛΔ • ݱࡏۃΊͯίετʹͳ͍ͬͯΔ
GAE/Go ࠾༻ͷ݁Ռ5 : ίετ 28 • Ξοςͷ GCP ڥɺ5݄ͷར༻ྉۚʢ҆ʣ ։ൃڥ
* αʔόαΠυΤϯδχΞਓ = 0ԁʢ1ԁະຬʣ QA ڥ = 1,100ԁ ຊ൪ڥɺDAU100ສࢉ͢Δͱ200ສԁ • අ༻ͷ༁ ɾDatastore Read Ops 46%ɺSimple Searches 28%ɺ Frontend Instances 17%ɺOut Bandwidth 4%ɺͦͷଞ 4%
GAE/Go ࠾༻ͷ݁Ռ5 : ίετ 29 • ΠϯϑϥઐͷΤϯδχΞ͕͍ͳͯ͘ӡ༻Ͱ͖ΔͨΊɺΠϯϑ ϥΛҡ࣋͢Δਓ݅අ͔͔͍ͬͯͳ͍ • ΦϯϓϨϛεΛؚΊͨଞͷͲͷΑ͏ͳΠϯϑϥڥͰɺ
GCP ΑΓ҆ՁʹαʔϏεΛ࡞Δ͜ͱͰ͖ͳ͍ • ͯ͢ैྔ՝ۚɻϢʔβ͕૿͑Εඅ༻ਖ਼ൺྫ͢ΔɻϦβʔϒ υΠϯελϯεͷΑ͏ͳɺܭըੑ͕ඞཁͳͷͳ͘ɺৗʹ҆Ձ ͳঢ়ଶ • ݁Ռ5: ίετ → ˕ྑ͍
݁ 30 • GAE/Go Λ࠾༻ͨ݁͠ՌɺͲ͏͔ͩͬͨ → ੜ࢈ੑɺεέʔϥϏϦςΟͱύϑΥʔϚϯεɺՄ༻ੑɺ αϙʔτମ੍ɺίετɺތுͰͳͯ͘͢ຬ • ࠓޙͷҊ݅Ͱ
GAE/Go Λ͍͍͔ͨ → Yes!