Share
Embed
「メルカリ アッテ」を支える Google App Engine と Golang
2016年6月8日の appengine ja night #33 の発表資料です。
Tatsuya Tsuruoka
June 08, 2016
Transcript
30 slides
-
ࣗݾհ 2 Ԭ ୡ • ικ & ϝϧΧϦ • ۀ࣌ͷόοΫΤϯυͷΤϯδχΞϦϯάͱ
։ൃνʔϜͷϚωʔδϝϯτΛ୲ • νʔϜָ͕͘͠ࣄͰ͖ΔΛ࡞Δͷ͕͖ -
֓ཁ 3 1. ৽ن Web αʔϏεͷΠϯϑϥڥͱͯ͠ GAE/Go Λ࠾༻ͨ͠ͷͳ͔ͥ 2.
GAE/Go ʹΑΔ։ൃͱӡ༻ͲͷΑ͏ͳͷͳͷ͔ɻ ੜ࢈ੑɺεέʔϥϏϦςΟͱύϑΥʔϚϯεɺՄ༻ੑɺ αϙʔτମ੍ɺίετɺଞͷΠϯϑϥڥͱൺֱͯ͠ Ͳ͏͔ͩͬͨ -
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 ʹܾఆɻ ϝϧΧϦʹର͢Δικͷٕज़తͳҐஔ͚͕ͮϋοΩϦͯ͠ɺ ޙʹͲ͏ͳ͍ͬͯΔ͔૾Ͱ͖ͨͷͰ໎͍ͳܾ͘ఆͰ͖ͨ -
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: ίετ → ˕ྑ͍