「メルカリ アッテ」を支える Google App Engine と Golang
by
Tatsuya Tsuruoka
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
ʮϝϧΧϦΞοςʯΛࢧ͑Δ 2016/06/08 (PPHMF"QQ&OHJOFͱ(PMBOH
Slide 2
Slide 2 text
ࣗݾհ 2 Ԭ ୡ • ικ & ϝϧΧϦ • ۀ࣌ͷόοΫΤϯυͷΤϯδχΞϦϯάͱ ։ൃνʔϜͷϚωʔδϝϯτΛ୲ • νʔϜָ͕͘͠ࣄͰ͖ΔΛ࡞Δͷ͕͖
Slide 3
Slide 3 text
֓ཁ 3 1. ৽ن Web αʔϏεͷΠϯϑϥڥͱͯ͠ GAE/Go Λ࠾༻ͨ͠ͷͳ͔ͥ 2. GAE/Go ʹΑΔ։ൃͱӡ༻ͲͷΑ͏ͳͷͳͷ͔ɻ ੜ࢈ੑɺεέʔϥϏϦςΟͱύϑΥʔϚϯεɺՄ༻ੑɺ αϙʔτମ੍ɺίετɺଞͷΠϯϑϥڥͱൺֱͯ͠ Ͳ͏͔ͩͬͨ
Slide 4
Slide 4 text
("&(P࠾༻ͷཧ༝
Slide 5
Slide 5 text
GAE/Go ࠾༻ͷཧ༝ 5 • ཧ༝1 : GAE ͷεέʔϥϒϧͳࢄγεςϜͷΈ • ཧ༝2 : GCP Γ্͕Γͷஹ͠ͱকདྷͷՄೳੑ • ཧ༝3 : νʔϜ։ൃʹ͍͍ͯΔ GolangɻGAE ʹΑΔਖ਼ࣜରԠ
Slide 6
Slide 6 text
GAE/Go ࠾༻ͷཧ༝1 : εέʔϥϒϧͳ GAE 6 • લఏɿ৽نࣄۀΞοςͷΠϯϑϥཁ݅ • άϩʔόϧ • ෳϦʔδϣϯʢUSɺEUɺAPACʣͰαʔϏεΛల։͍ͨ͠ • ڞ௨ͷίʔυ & ͻͱͭͷσʔλϕʔε • େنΞϓϦέʔγϣϯ • DAUઍສਓنɻॠؒతͳΞΫηεສϦΫΤετ/ඵ • ϋΠεέʔϥϒϧ • ػೳվम࣌ͳͲʹαʔϏεແఀࢭʹ͍ͨ͠ • εέʔϧͷͨΊͷ४උ࡞ۀΛͳ͍ͨ͘͠
Slide 7
Slide 7 text
GAE/Go ࠾༻ͷཧ༝1 : εέʔϥϒϧͳ GAE 7 • Α͋͘ΔΞϓϩʔνͰɺ͏·͍͘͘ͷɿ • ҊA : աڈʹܦݧͷ͋ΔߏطଘͷΠϯϑϥΛ͏ • ҊB : ৽نઃܭɻকདྷతʹඞཁʹԠͯ͡ઃܭΛੈަͤ͞Δ • → ϝϧΧϦͷͱ͖ҊBɻϦϦʔεޙ3ϲ݄ͰेສϢʔβͱ͍͏ఆΛ͠ ͯɺߴੑೳઐ༻αʔό1ͰߏஙɻߏΛੈަͤ͞Δ͜ͱͰεέʔϧ͞ ͍ͤͯͬͨ • ࠓճͷ৽نࣄۀͷΠϯϑϥཁ݅ϋʔυϧ͕ߴ͘ɺҊAɺҊB ͲͪΒͷΞϓ ϩʔν͏·͋ͯ͘·Βͳ͔ͬͨ
Slide 8
Slide 8 text
GAE/Go ࠾༻ͷཧ༝1 : εέʔϥϒϧͳ GAE 8 • ผͷΞϓϩʔνɺPaaS ʹ͍ͭͯߟ͑ͯΈΔ • GAE Ҏ֎ͷ PaaS ʁ • AWS ্ʹߏஙͯ͠ఏڙ͞Ε͍ͯΔ PaaS AWSʢIaaSʣͷ੍Λड͚ͯ ͠·͏ • PaaS ΛӡӦ͍ͯ͠Δاۀͷن͕খ͍͞߹ɺͦ͜ʹΠϯϑϥΛ༬͚Δͱ ϦεΫΛίϯτϩʔϧͮ͠Β͍ • Microsoft Azure Force.com ɺࠓճͷ։ൃཁ݅ʹ߹Θͳ͍
Slide 9
Slide 9 text
GAE/Go ࠾༻ͷཧ༝1 : εέʔϥϒϧͳ GAE 9 • GAE → ཁ݅ΛຬͨͤΔ • άϩʔόϧ • US ͔Βੈք͚ʹଟ͘ͷαʔϏε͕ల։͞Ε͍ͯΔ • Google ͱΠϯϑϥΛڞ༻͍ͯ͠Δ GAE વάϩʔόϧରԠ • େنΞϓϦέʔγϣϯ • Snapchat ͷΑ͏ͳDAU1ԯਓنͷࣄྫ • ϋΠεέʔϥϒϧ • ࢄγεςϜΛ࡞ΔͨΊͷΈ͕͍ͬͯΔ • খ͞ͳن͔Βେ͖ͳن·Ͱઢܗʹεέʔϧ
Slide 10
Slide 10 text
GAE/Go ࠾༻ͷཧ༝2 : GCP Γ্͕Γͷஹ͠ 10 • ཧ༝2 : GCP Γ্͕Γͷஹ͠ͱকདྷͷՄೳੑ • 20159݄ࠒɺ৽نࣄۀͷٕज़બఆΛ࢝͠Ίͨͱ͖ʹɺ͢Ͱʹ GCP(GKE) Λ ͬͯ։ൃΛ͍ͯͨ͠ΤϯδχΞ͔ΒʮGCP ͕ඇৗʹྑ͔ͬͨʯͱ͍͏Λ ฉ͍ͨ • ͦΕ·Ͱ BigQuery GCE ͘Β͍͔͠৮͍ͬͯͳ͔ͬͨͷͰɺใऩूΛ։ ࢝ɻGoogle ͷ୲ऀΛհͯ͠Β͍ɺ͙͢ʹ࠷৽ͷ GCP ใΛڭ͑ͯ Β͏ • → AWS ͷιϦϡʔγϣϯΞʔΩςΫτͷΑ͏ͳͤΔٕज़୲ऀ͕͍ Δ͜ͱʹ·ͣڻ͍ͨ
Slide 11
Slide 11 text
GAE/Go ࠾༻ͷཧ༝2 : GCP Γ্͕Γͷஹ͠ 11 • ࠓͰͦ͜ීٴ͍ͯ͠Δ AWS ౦ژϦʔδϣϯ͕ͳ͍͜Ζٕज़୲ऀ͍ͳ ͯ͘ɺΦϯϥΠϯυΩϡϝϯτΛཔΔ͔͠ͳ͔ͬͨ • ۙ·Ͱ GCP ͦ͏͍͏ঢ়ଶʹͳ͍ͬͯΔͱࢥ͍ͬͯͨ → ͤΔ୲ऀ͕͍ͯɺGCP ʹؔ͢Δٙʹਝˍత֬ʹճΛΒ ͑Δঢ়ଶ • ͞ΒʹΦϯϥΠϯ্ͰɺGoogle ʹΑΔ GCP ͷใΞοϓσʔτසߴ ·͍ͬͯΔ • → Google ͕ GCP ʹରͯ͠ଟ͘ͷϦιʔεΛׂ͍͍ͯΔ͜ͱ͕Θ͔ͬͨɻ αʔϏεΛͷͤΔΠϯϑϥͱͯ͠ेʹ҆શͱஅ
Slide 12
Slide 12 text
GAE/Go ࠾༻ͷཧ༝3 : Golang αϙʔτ 12 • ࠷ॳʹ Golang ʹ͍ͭͯݕ౼͢ΔΑ͏ʹͳ͖͔͚ͬͨͬɿ ࠾༻ձ৯ʹ͔͏λΫγʔͷத… ࢁాʮ࣍Ͳ͏͍͏ݴޠͰ࡞Δʁʯ ʮϝϧΧϦͱಉ͡ PHP Ͱ͢Ͷʯ ࢁాʮGo ͬͯͲ͏͔ͳʁʯ ʮྑ͍ݴޠͰ͢ͶɻͨͩࠓճPHPͰ࣮֬ʹ࡞Ζ͏ͱࢥ͍·͢ʯ ʢͦͷޙ Golang ʹ͍͍ͭͯΖ͍ΖใΛूΊΔʣ
Slide 13
Slide 13 text
GAE/Go ࠾༻ͷཧ༝3 : Golang αϙʔτ 13 • Golang ͱ Web αʔϏε։ൃͷ૬ੑ • CLI ͳͲγεςϜϓϩάϥϛϯάಘҙͳྖҬͱͯ͘͠ΒΕ͍ͯΔ • → ϝϧΧϦࣾͰଟͷ࣮͋Δ Go ϓϩμΫτ͕͋Γɺੜ࢈ੑͷߴ ͞ೝ͍ࣝͯͨ͠ • ࣮ࡍʹ৮ΔͱɺWeb αʔϏε։ൃʹ͓͍ͯඇৗʹڧྗͳ͜ͱ͕Θ͔ͬͯ ͖ͨ • ݴޠࣗମͷಛɿ੩తܕ͚ɺγϯϓϧͳߏจɺgo fmt/doc ͳͲ • ύοέʔδ/ϥΠϒϥϦͷےͷྑ͞ɿnet/http x/net/context • GAE Golang ͷਖ਼ࣜରԠ͕ൃද͞Ε͍ͯͨʢ20157݄ʣ
Slide 14
Slide 14 text
GAE/Go ࠾༻ͷཧ༝3 : Golang αϙʔτ 14 • ཧ༝1 : GAE ͷεέʔϥϒϧͳࢄγεςϜͷΈ • ཧ༝2 : GCP Γ্͕Γͷஹ͠ͱকདྷͷՄೳੑ • ཧ༝3 : νʔϜ։ൃʹ͍͍ͯΔ GolangɻGAE ʹΑΔਖ਼ࣜରԠ → ͜ΕΒͷཧ༝Ͱικࣾ GAE/Go ʹܾఆɻ ϝϧΧϦʹର͢Δικͷٕज़తͳҐஔ͚͕ͮϋοΩϦͯ͠ɺ ޙʹͲ͏ͳ͍ͬͯΔ͔૾Ͱ͖ͨͷͰ໎͍ͳܾ͘ఆͰ͖ͨ
Slide 15
Slide 15 text
("&(P࠾༻ͷ݁Ռ
Slide 16
Slide 16 text
GAE/Go ࠾༻ͷ݁Ռ 16 • ݁Ռ1 : ੜ࢈ੑ • ݁Ռ2 : εέʔϥϏϦςΟͱύϑΥʔϚϯε • ݁Ռ3 : Մ༻ੑ • ݁Ռ4 : αϙʔτମ੍ • ݁Ռ5 : ίετ
Slide 17
Slide 17 text
GAE/Go ࠾༻ͷ݁Ռ1 : ੜ࢈ੑ 17 • ͲΕ͚ͩૉΒ͍͠ͱݴΘΕΔΠϯϑϥ։ൃݴޠͰ͋ͬͯɺ ͔ͦ͜ΒϓϩμΫτ͕ϦϦʔε͞Εͳ͚Εɺҙຯ͕ͳ͍ • ࠓճɺGAE/Go Λࣗ৴Λ࣋ͬͯબͨ͠ͷͷɺ͜ͷٕज़͕ੈؒ ҰൠͰීٴ͍ͯ͘͠ͷͳͷ͔Α͘ݟۃΊΔඞཁ͕͋ͬͨ • →ʮΞοςʯͷόοΫΤϯυͷ։ൃશһ͕ GAE Golang ະܦݧ͔Β࢝·͍ͬͯΔɻࣾͷৄ͍͠ਓʹ(ҙਤతʹ)૬ஊͤ ͣʹ։ൃ
Slide 18
Slide 18 text
GAE/Go ࠾༻ͷ݁Ռ1 : ੜ࢈ੑ 18 • ࣮ࡍʹͲ͏͔ͩͬͨɿ • ։ൃணख͔Β2ϲ݄ʹݶఆެ։όʔδϣϯΛϦϦʔεɻ5ϲ݄ ʹਖ਼ࣜ൛ϦϦʔε • ະܦݧ͔Β࢝·ͬͯԿΒ͔ͷΠϯϑϥͱ։ൃݴޠΛѻ͑ΔΤ ϯδχΞͰ͋Εɺ͙͢ʹϓϩμΫτͷ։ൃʹՃΘΕΔ • → ೖࣾͯ͠1िؒҎʹຊ൪ڥͰಈ͘ίʔυΛॻ͍ͯߩݙɻ 1ϲ݄ʹपғͷίʔυͱḮ৭ͳ͍Ϩϕϧ • ݁Ռ1: ੜ࢈ੑ → ˕ྑ͍
Slide 19
Slide 19 text
GAE/Go ࠾༻ͷ݁Ռ2 : εέʔϥϏϦςΟͱύϑΥʔϚϯε 19 • ݁Ռ2 : εέʔϥϏϦςΟͱύϑΥʔϚϯε • GAE ͷΞϓϦɺਖ਼͘͠ઃܭ࣮ͯͨ࣌͠͠Ͱෛՙରࡦ͕ྃ ͍ͯ͠Δ → ྫɿϝοηʔδػೳɻDatastore ʹهͯ͠औಘ͢Δ͚ͩɻ Ϣʔβ͕ͲΕ͚ͩ૿͑ͯϝοηʔδྲྀ௨݅ಡΈऔΓճ͕૿ ͑ͯԿ͠ͳͯ͘ OK
Slide 20
Slide 20 text
GAE/Go ࠾༻ͷ݁Ռ2 : εέʔϥϏϦςΟͱύϑΥʔϚϯε 20 • ΞοςͰ࣮ࡍʹ͋ͬͨෛՙɿ • ϝϧΧϦͷΞϓϦ্ͷόφʔ͔ΒΞοςͷ༠ಋ • → ҰॠͰ App Store ϥϯΩϯά্Ґ • ेສʙඦສ݅ͷ Push ௨ͷҰ੪৴ • → ॠؒతʹΞΫηε͕ेഒʹ • ͜ΕΒͷෛՙ GAE/Go ্ͰαʔϏε͕ಈ͍͍ͯΔ࣌ͰࣗಈͰ εέʔϧͯ͠ରԠͰ͖Δ
Slide 21
Slide 21 text
GAE/Go ࠾༻ͷ݁Ռ2 : εέʔϥϏϦςΟͱύϑΥʔϚϯε 21 • ϓϩϏδϣχϯάΥʔϜΞοϓෆཁ • ϓϩϞʔγϣϯνʔϜͱΤϯδχΞ͕ࣄલʹෛՙʹ͍ͭͯଧͪ ߹ΘͤΔඞཁͳ͠ • 1Ϣʔβͷͱ͖ʹਖ਼͘͠ಈ͍͍ͯΕɺԿઍສϢʔβʹͳͬͯ ͳ͠ ※ಛఆͷΩʔʹର͢Δߋ৽ॲཧ͕େྔൃੜ͢Δͱ͖ͳͲɺྫ֎͋Γ
Slide 22
Slide 22 text
GAE/Go ࠾༻ͷ݁Ռ2 : εέʔϥϏϦςΟͱύϑΥʔϚϯε 22 • ͜ͷεέʔϥϏϦςΟ Golang ͷύϑΥʔϚϯεʹΑ࣮ͬͯݱ͞ Ε͍ͯΔ • GAE ͷΠϯελϯε • Golang ͷ߹ɺेms Ͱىಈ͢Δ • ΞΫηε͕͋Ε૿͑ͯɺͳ͚ΕݮΔ → ΞΫηε͕͋Δͱ͖ʹॠ࣌ʹىಈ͢ΔͷͰΥʔϜΞοϓෆཁ • ݁Ռ2: εέʔϥϏϦςΟͱύϑΥʔϚϯε → ˕ྑ͍
Slide 23
Slide 23 text
GAE/Go ࠾༻ͷ݁Ռ3 : Մ༻ੑ 23 • ݁Ռ3 : Մ༻ੑ • Ξος 100% Քಇத → ·ͩӡ༻ظ͕͍ؒͨΊਖ਼֬ͳධՁͰ͖ͳ͍ • ϝϧΧϦͷաڈͷΠϯϑϥϐʔΫλΠϜʹͳΔͱμϯ͢Δ͜ͱ ͕Α͋ͬͨ͘ͷͰɺࣾͷඪઃఆʹՔಇΛೖΕ͍ͯͨ • Ξος100%αʔϏεఏڙͰ͖Δ͜ͱ͕લఏͳͷͰඪઃఆ͠ ͍ͯͳ͍
Slide 24
Slide 24 text
GAE/Go ࠾༻ͷ݁Ռ3 : Մ༻ੑ 24 • ϝϯςφϯεܭըఀࢭʁ →ΞοςͰϝϯςφϯεܭըఀࢭ༧ఆ͍ͯ͠ͳ͍ɻྫ͑ DB ʹΧϥϜΛՃ͢ΔͨΊʹαʔϏεΛࢭΊͨΓ͠ͳ͍ • GAE + Datastore Ͱ͋Ε؆୯ʹආ͚ΒΕΔ • ͍ͭͰ͑ΔαʔϏεʹ͢ΔͨΊʹɺଟେͳ࿑ྗΛ͍ͬͯΔΘ ͚Ͱͳ͍͕େࣄ • GAE Datastore ͷಛੑʹ߹Θͤͯ࡞Εɺͦ͏ͳΔ • ݁Ռ3: Մ༻ੑ → ˕ྑ͍
Slide 25
Slide 25 text
GAE/Go ࠾༻ͷ݁Ռ4 : αϙʔτମ੍ 25 • ݁Ռ4 : αϙʔτମ੍ • ࣄલʹใΛूΊͯαϙʔτମ੍ʹ͍ͭͯΑ͘Θ͔Βͳ͔ͬͨ ͷͰɺݸਓతʹҰ൪ݒ೦ͩͬͨ • Google ͞ΜͱͷϛʔςΟϯάΛ܁Γฦͨ͠ΓɺGCP ͷ༗ঈαϙʔ τʢGoldϓϥϯʣʹೖΔ͜ͱͰɺॆ࣮ͨ͠ମ੍͕ݟ͖͑ͯͨ
Slide 26
Slide 26 text
GAE/Go ࠾༻ͷ݁Ռ4 : αϙʔτମ੍ 26 • ϝϧΧϦͷͷརɿಉ͡Ϗϧʹ Google ͞Μ͕͍ΔͷͰɺࠔͬͨͱ ͖ʹ͙͢ʹͯ͠ใަͰ͖Δ → Ӧۀ୲ऀٕज़୲ऀ͕ͨ͘͞Μ͍ΔͷͰɺଞͷϏϧͷօ͞ ·΄΅ಉ༷ͷαϙʔτड͚ΒΕΔ(ͣ) • GCP ͷ༗ঈαϙʔτɺߴͳٕज़తͳ࣭ʹରͯ͠1࣍ճ ʹདྷͨΓɺͯ͘2Ҏʹ͕ղܾ͢Δ • ଞͷબࢶɿτοϓήʔτ͞ΜͷΑ͏ͳ GCP ύʔτφʔاۀ • ݁Ռ4: αϙʔτମ੍ → ˕ྑ͍
Slide 27
Slide 27 text
GAE/Go ࠾༻ͷ݁Ռ5 : ίετ 27 • ݁Ռ5 : ίετ • աڈʹར༻ྉ͕ۚߴֹͩͬͨΛฉ͍ͨΓ͢Δ • աڈҰ୴Εͯɺ͍·͏ͱͲ͏͍͏ֹۚʹͳΔͷ͔ΛΔ • ݱࡏۃΊͯίετʹͳ͍ͬͯΔ
Slide 28
Slide 28 text
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%
Slide 29
Slide 29 text
GAE/Go ࠾༻ͷ݁Ռ5 : ίετ 29 • ΠϯϑϥઐͷΤϯδχΞ͕͍ͳͯ͘ӡ༻Ͱ͖ΔͨΊɺΠϯϑ ϥΛҡ࣋͢Δਓ݅අ͔͔͍ͬͯͳ͍ • ΦϯϓϨϛεΛؚΊͨଞͷͲͷΑ͏ͳΠϯϑϥڥͰɺ GCP ΑΓ҆ՁʹαʔϏεΛ࡞Δ͜ͱͰ͖ͳ͍ • ͯ͢ैྔ՝ۚɻϢʔβ͕૿͑Εඅ༻ਖ਼ൺྫ͢ΔɻϦβʔϒ υΠϯελϯεͷΑ͏ͳɺܭըੑ͕ඞཁͳͷͳ͘ɺৗʹ҆Ձ ͳঢ়ଶ • ݁Ռ5: ίετ → ˕ྑ͍
Slide 30
Slide 30 text
݁ 30 • GAE/Go Λ࠾༻ͨ݁͠ՌɺͲ͏͔ͩͬͨ → ੜ࢈ੑɺεέʔϥϏϦςΟͱύϑΥʔϚϯεɺՄ༻ੑɺ αϙʔτମ੍ɺίετɺތுͰͳͯ͘͢ຬ • ࠓޙͷҊ݅Ͱ GAE/Go Λ͍͍͔ͨ → Yes!