「メルカリ アッテ」を支える Google App Engine と Golang

「メルカリ アッテ」を支える Google App Engine と Golang

2016年6月8日の appengine ja night #33 の発表資料です。

4ea490210007ad68a5911217523bd137?s=128

Tatsuya Tsuruoka

June 08, 2016
Tweet

Transcript

  1. 2.

    ࣗݾ঺հ 2 ௽Ԭ ୡ໵ • ι΢κ΢ & ϝϧΧϦ • ૑ۀ࣌ͷόοΫΤϯυͷΤϯδχΞϦϯάͱ


    ։ൃνʔϜͷϚωʔδϝϯτΛ୲౰ • νʔϜָ͕͘͠࢓ࣄͰ͖Δ৔Λ࡞Δͷ͕޷͖
  2. 3.

    ֓ཁ 3 1. ৽ن Web αʔϏεͷΠϯϑϥ؀ڥͱͯ͠
 GAE/Go Λ࠾༻ͨ͠ͷ͸ͳ͔ͥ 
 2.

    GAE/Go ʹΑΔ։ൃͱӡ༻͸ͲͷΑ͏ͳ΋ͷͳͷ͔ɻ
 ੜ࢈ੑɺεέʔϥϏϦςΟͱύϑΥʔϚϯεɺՄ༻ੑɺ
 αϙʔτମ੍ɺίετ͸ɺଞͷΠϯϑϥ؀ڥͱൺֱͯ͠ Ͳ͏͔ͩͬͨ
  3. 5.

    GAE/Go ࠾༻ͷཧ༝ 5 • ཧ༝1 : GAE ͷεέʔϥϒϧͳ෼ࢄγεςϜͷ࢓૊Έ • ཧ༝2

    : GCP ੝Γ্͕Γͷஹ͠ͱকདྷͷՄೳੑ • ཧ༝3 : νʔϜ։ൃʹ޲͍͍ͯΔ GolangɻGAE ʹΑΔਖ਼ࣜରԠ
  4. 6.

    GAE/Go ࠾༻ͷཧ༝1 : εέʔϥϒϧͳ GAE 6 • લఏɿ৽نࣄۀΞοςͷΠϯϑϥཁ݅ • άϩʔόϧ

    • ෳ਺ϦʔδϣϯʢUSɺEUɺAPACʣͰαʔϏεΛల։͍ͨ͠ • ڞ௨ͷίʔυ & ͻͱͭͷσʔλϕʔε • େن໛ΞϓϦέʔγϣϯ • DAU਺ઍສਓن໛ɻॠؒతͳΞΫηε͸਺ສϦΫΤετ/ඵ • ϋΠεέʔϥϒϧ • ػೳվम࣌ͳͲʹαʔϏεແఀࢭʹ͍ͨ͠ • εέʔϧͷͨΊͷ४උ࡞ۀΛͳ͍ͨ͘͠
  5. 7.

    GAE/Go ࠾༻ͷཧ༝1 : εέʔϥϒϧͳ GAE 7 • Α͋͘ΔΞϓϩʔνͰɺ͏·͍͘͘΋ͷ͸ɿ • ҊA

    : աڈʹܦݧͷ͋Δߏ੒΍طଘͷΠϯϑϥΛ࢖͏ • ҊB : ৽نઃܭɻকདྷతʹ͸ඞཁʹԠͯ͡ઃܭΛੈ୅ަ୅ͤ͞Δ • → ϝϧΧϦͷͱ͖͸ҊBɻϦϦʔεޙ3ϲ݄Ͱ਺ेສϢʔβͱ͍͏૝ఆΛ͠ ͯɺߴੑೳઐ༻αʔό1୆Ͱߏஙɻߏ੒Λੈ୅ަ୅ͤ͞Δ͜ͱͰεέʔϧ͞ ͍ͤͯͬͨ • ࠓճͷ৽نࣄۀͷΠϯϑϥཁ݅͸ϋʔυϧ͕ߴ͘ɺҊAɺҊB ͲͪΒͷΞϓ ϩʔν΋͏·͋ͯ͘͸·Βͳ͔ͬͨ
  6. 8.

    GAE/Go ࠾༻ͷཧ༝1 : εέʔϥϒϧͳ GAE 8 • ผͷΞϓϩʔνɺPaaS ʹ͍ͭͯߟ͑ͯΈΔ •

    GAE Ҏ֎ͷ PaaS ͸ʁ • AWS ্ʹߏஙͯ͠ఏڙ͞Ε͍ͯΔ PaaS ͸ AWSʢIaaSʣͷ੍໿Λड͚ͯ ͠·͏ • PaaS ΛӡӦ͍ͯ͠Δاۀͷن໛͕খ͍͞৔߹ɺͦ͜ʹΠϯϑϥΛ༬͚Δͱ ϦεΫΛίϯτϩʔϧͮ͠Β͍ • Microsoft Azure ΍ Force.com ͸ɺࠓճͷ։ൃཁ݅ʹ͸߹Θͳ͍
  7. 9.

    GAE/Go ࠾༻ͷཧ༝1 : εέʔϥϒϧͳ GAE 9 • GAE → ཁ݅ΛຬͨͤΔ

    • άϩʔόϧ • US ͔Βੈք޲͚ʹଟ͘ͷαʔϏε͕ల։͞Ε͍ͯΔ • Google ͱΠϯϑϥΛڞ༻͍ͯ͠Δ GAE ΋౰વάϩʔόϧରԠ • େن໛ΞϓϦέʔγϣϯ • Snapchat ͷΑ͏ͳDAU1ԯਓن໛ͷࣄྫ • ϋΠεέʔϥϒϧ • ෼ࢄγεςϜΛ࡞ΔͨΊͷ࢓૊Έ͕੔͍ͬͯΔ • খ͞ͳن໛͔Βେ͖ͳن໛·Ͱઢܗʹεέʔϧ
  8. 10.

    GAE/Go ࠾༻ͷཧ༝2 : GCP ੝Γ্͕Γͷஹ͠ 10 • ཧ༝2 : GCP

    ੝Γ্͕Γͷஹ͠ͱকདྷͷՄೳੑ • 2015೥9݄ࠒɺ৽نࣄۀͷٕज़બఆΛ࢝͠Ίͨͱ͖ʹɺ͢Ͱʹ GCP(GKE) Λ ࢖ͬͯ։ൃΛ͍ͯͨ͠ΤϯδχΞ͔ΒʮGCP ͕ඇৗʹྑ͔ͬͨʯͱ͍͏࿩Λ ฉ͍ͨ • ͦΕ·Ͱ BigQuery ΍ GCE ͘Β͍͔͠৮͍ͬͯͳ͔ͬͨͷͰɺ৘ใऩूΛ։ ࢝ɻGoogle ͷ୲౰ऀΛ঺հͯ͠΋Β͍ɺ͙͢ʹ࠷৽ͷ GCP ৘ใΛڭ͑ͯ΋ Β͏ • → AWS ͷιϦϡʔγϣϯΞʔΩςΫτͷΑ͏ͳ௚઀࿩ͤΔٕज़୲౰ऀ͕͍ Δ͜ͱʹ·ͣڻ͍ͨ
  9. 11.

    GAE/Go ࠾༻ͷཧ༝2 : GCP ੝Γ্͕Γͷஹ͠ 11 • ࠓͰͦ͜ීٴ͍ͯ͠Δ AWS ΋౦ژϦʔδϣϯ͕ͳ͍͜Ζ͸ٕज़୲౰ऀ΋͍ͳ

    ͯ͘ɺΦϯϥΠϯυΩϡϝϯτΛཔΔ͔͠ͳ͔ͬͨ • ௚ۙ·Ͱ GCP ΋ͦ͏͍͏ঢ়ଶʹͳ͍ͬͯΔͱࢥ͍ͬͯͨ → ௚઀࿩ͤΔ୲౰ऀ͕͍ͯɺGCP ʹؔ͢Δٙ໰ʹ΋ਝ଎ˍత֬ʹճ౴Λ΋Β ͑Δঢ়ଶ • ͞ΒʹΦϯϥΠϯ্Ͱ΋ɺGoogle ʹΑΔ GCP ͷ৘ใΞοϓσʔτස౓͸ߴ ·͍ͬͯΔ • → Google ͕ GCP ʹରͯ͠ଟ͘ͷϦιʔεΛׂ͍͍ͯΔ͜ͱ͕Θ͔ͬͨɻ αʔϏεΛͷͤΔΠϯϑϥͱͯ͠े෼ʹ҆શͱ൑அ
  10. 12.

    GAE/Go ࠾༻ͷཧ༝3 : Golang αϙʔτ 12 • ࠷ॳʹ Golang ʹ͍ͭͯݕ౼͢ΔΑ͏ʹͳ͖͔͚ͬͨͬɿ


    
 ࠾༻ձ৯ʹ޲͔͏λΫγʔͷத… 
 ࢁాʮ࣍Ͳ͏͍͏ݴޠͰ࡞Δʁʯ
 ௽ʮϝϧΧϦͱಉ͡ PHP Ͱ͢Ͷʯ
 ࢁాʮGo ͬͯͲ͏͔ͳʁʯ
 ௽ʮྑ͍ݴޠͰ͢Ͷɻͨͩࠓճ΋PHPͰ࣮֬ʹ࡞Ζ͏ͱࢥ͍·͢ʯ
 ʢͦͷޙ Golang ʹ͍͍ͭͯΖ͍Ζ৘ใΛूΊΔʣ
  11. 13.

    GAE/Go ࠾༻ͷཧ༝3 : Golang αϙʔτ 13 • Golang ͱ Web

    αʔϏε։ൃͷ૬ੑ • CLI ͳͲγεςϜϓϩάϥϛϯά͸ಘҙͳྖҬͱͯ͠޿͘஌ΒΕ͍ͯΔ • → ϝϧΧϦࣾ಺Ͱ΋ଟ਺ͷ࣮੷͋Δ Go ϓϩμΫτ͕͋Γɺੜ࢈ੑͷߴ ͞͸ೝ͍ࣝͯͨ͠ • ࣮ࡍʹ৮ΔͱɺWeb αʔϏε։ൃʹ͓͍ͯ΋ඇৗʹڧྗͳ͜ͱ͕Θ͔ͬͯ ͖ͨ • ݴޠࣗମͷಛ௃ɿ੩తܕ෇͚ɺγϯϓϧͳߏจɺgo fmt/doc ͳͲ • ύοέʔδ/ϥΠϒϥϦͷےͷྑ͞ɿnet/http ΍ x/net/context • GAE ΋ Golang ͷਖ਼ࣜରԠ͕ൃද͞Ε͍ͯͨʢ2015೥7݄ʣ
  12. 14.

    GAE/Go ࠾༻ͷཧ༝3 : Golang αϙʔτ 14 • ཧ༝1 : GAE

    ͷεέʔϥϒϧͳ෼ࢄγεςϜͷ࢓૊Έ • ཧ༝2 : GCP ੝Γ্͕Γͷஹ͠ͱকདྷͷՄೳੑ • ཧ༝3 : νʔϜ։ൃʹ޲͍͍ͯΔ GolangɻGAE ʹΑΔਖ਼ࣜରԠ
 
 → ͜ΕΒͷཧ༝Ͱι΢κ΢ࣾ͸ GAE/Go ʹܾఆɻ
 ϝϧΧϦʹର͢Δι΢κ΢ͷٕज़తͳҐஔ͚͕ͮϋοΩϦͯ͠ɺ
 ਺೥ޙʹͲ͏ͳ͍ͬͯΔ͔΋૝૾Ͱ͖ͨͷͰ໎͍ͳܾ͘ఆͰ͖ͨ
  13. 16.

    GAE/Go ࠾༻ͷ݁Ռ 16 • ݁Ռ1 : ੜ࢈ੑ • ݁Ռ2 :

    εέʔϥϏϦςΟͱύϑΥʔϚϯε • ݁Ռ3 : Մ༻ੑ • ݁Ռ4 : αϙʔτମ੍ • ݁Ռ5 : ίετ
  14. 17.

    GAE/Go ࠾༻ͷ݁Ռ1 : ੜ࢈ੑ 17 • ͲΕ͚ͩૉ੖Β͍͠ͱݴΘΕΔΠϯϑϥ΍։ൃݴޠͰ͋ͬͯ΋ɺ ͔ͦ͜ΒϓϩμΫτ͕ϦϦʔε͞Εͳ͚Ε͹ɺҙຯ͕ͳ͍ • ࠓճɺGAE/Go

    Λࣗ৴Λ࣋ͬͯબ୒ͨ͠΋ͷͷɺ͜ͷٕज़͕ੈؒ ҰൠͰ΋ීٴ͍ͯ͘͠΋ͷͳͷ͔͸Α͘ݟۃΊΔඞཁ͕͋ͬͨ • →ʮΞοςʯͷόοΫΤϯυͷ։ൃ͸શһ͕ GAE ΋ Golang ΋ ະܦݧ͔Β࢝·͍ͬͯΔɻࣾ಺ͷৄ͍͠ਓʹ͸(ҙਤతʹ)૬ஊͤ ͣʹ։ൃ
  15. 18.

    GAE/Go ࠾༻ͷ݁Ռ1 : ੜ࢈ੑ 18 • ࣮ࡍʹͲ͏͔ͩͬͨɿ • ։ൃணख͔Β2ϲ݄໨ʹݶఆެ։όʔδϣϯΛϦϦʔεɻ5ϲ݄ ໨ʹਖ਼ࣜ൛ϦϦʔε

    • ະܦݧ͔Β࢝·ͬͯ΋ԿΒ͔ͷΠϯϑϥͱ։ൃݴޠΛѻ͑ΔΤ ϯδχΞͰ͋Ε͹ɺ͙͢ʹϓϩμΫτͷ։ൃʹՃΘΕΔ • → ೖࣾͯ͠1िؒҎ಺ʹຊ൪؀ڥͰಈ͘ίʔυΛॻ͍ͯߩݙɻ 1ϲ݄໨ʹ͸पғͷίʔυͱḮ৭ͳ͍Ϩϕϧ΋ • ݁Ռ1: ੜ࢈ੑ → ˕ྑ͍
  16. 19.

    GAE/Go ࠾༻ͷ݁Ռ2 : εέʔϥϏϦςΟͱύϑΥʔϚϯε 19 • ݁Ռ2 : εέʔϥϏϦςΟͱύϑΥʔϚϯε
 •

    GAE ͷΞϓϦ͸ɺਖ਼͘͠ઃܭ࣮ͯ͠૷ͨ࣌͠఺Ͱෛՙରࡦ͕׬ྃ ͍ͯ͠Δ → ྫɿϝοηʔδػೳɻDatastore ʹ௥هͯ͠औಘ͢Δ͚ͩɻ Ϣʔβ͕ͲΕ͚ͩ૿͑ͯϝοηʔδྲྀ௨݅਺΍ಡΈऔΓճ਺͕૿ ͑ͯ΋Կ΋͠ͳͯ͘ OK
  17. 20.

    GAE/Go ࠾༻ͷ݁Ռ2 : εέʔϥϏϦςΟͱύϑΥʔϚϯε 20 • ΞοςͰ࣮ࡍʹ͋ͬͨෛՙɿ • ϝϧΧϦͷΞϓϦ্ͷόφʔ͔ΒΞος΁ͷ༠ಋ •

    → ҰॠͰ App Store ϥϯΩϯά্Ґ΁ • ਺ेສʙ਺ඦສ݅ͷ Push ௨஌ͷҰ੪഑৴ • → ॠؒతʹΞΫηε͕਺ेഒʹ • ͜ΕΒͷෛՙ͸ GAE/Go ্ͰαʔϏε͕ಈ͍͍ͯΔ࣌఺ͰࣗಈͰ εέʔϧͯ͠ରԠͰ͖Δ
  18. 21.

    GAE/Go ࠾༻ͷ݁Ռ2 : εέʔϥϏϦςΟͱύϑΥʔϚϯε 21 • ϓϩϏδϣχϯά΍΢ΥʔϜΞοϓ͸ෆཁ • ϓϩϞʔγϣϯνʔϜͱΤϯδχΞ͕ࣄલʹෛՙʹ͍ͭͯଧͪ ߹ΘͤΔඞཁͳ͠

    • 1Ϣʔβͷͱ͖ʹਖ਼͘͠ಈ͍͍ͯΕ͹ɺԿઍສϢʔβʹͳͬͯ΋໰ ୊ͳ͠ ※ಛఆͷΩʔʹର͢Δߋ৽ॲཧ͕େྔൃੜ͢Δͱ͖ͳͲɺྫ֎͸͋Γ
  19. 22.

    GAE/Go ࠾༻ͷ݁Ռ2 : εέʔϥϏϦςΟͱύϑΥʔϚϯε 22 • ͜ͷεέʔϥϏϦςΟ͸ Golang ͷύϑΥʔϚϯεʹΑ࣮ͬͯݱ͞ Ε͍ͯΔ

    • GAE ͷΠϯελϯε͸ • Golang ͷ৔߹ɺ਺ेms Ͱىಈ͢Δ • ΞΫηε͕͋Ε͹૿͑ͯɺͳ͚Ε͹ݮΔ → ΞΫηε͕͋Δͱ͖ʹॠ࣌ʹىಈ͢ΔͷͰ΢ΥʔϜΞοϓෆཁ • ݁Ռ2: εέʔϥϏϦςΟͱύϑΥʔϚϯε → ˕ྑ͍
  20. 23.

    GAE/Go ࠾༻ͷ݁Ռ3 : Մ༻ੑ 23 • ݁Ռ3 : Մ༻ੑ
 •

    Ξος͸ 100% Քಇத → ·ͩӡ༻ظ͕ؒ୹͍ͨΊਖ਼֬ͳධՁ͸Ͱ͖ͳ͍ • ϝϧΧϦͷաڈͷΠϯϑϥ͸ϐʔΫλΠϜʹͳΔͱμ΢ϯ͢Δ͜ͱ ͕Α͋ͬͨ͘ͷͰɺࣾ಺ͷ໨ඪઃఆʹՔಇ཰ΛೖΕ͍ͯͨ • Ξος͸100%αʔϏεఏڙͰ͖Δ͜ͱ͕લఏͳͷͰ໨ඪઃఆ΋͠ ͍ͯͳ͍
  21. 24.

    GAE/Go ࠾༻ͷ݁Ռ3 : Մ༻ੑ 24 • ϝϯςφϯε΍ܭըఀࢭ͸ʁ →ΞοςͰ͸ϝϯςφϯε΍ܭըఀࢭ͸༧ఆ͍ͯ͠ͳ͍ɻྫ͑͹ DB ʹΧϥϜΛ௥Ճ͢ΔͨΊʹαʔϏεΛࢭΊͨΓ͸͠ͳ͍

    • GAE + Datastore Ͱ͋Ε͹؆୯ʹආ͚ΒΕΔ • ͍ͭͰ΋࢖͑ΔαʔϏεʹ͢ΔͨΊʹɺଟେͳ࿑ྗΛ෷͍ͬͯΔΘ ͚Ͱ͸ͳ͍఺͕େࣄ • GAE ΍ Datastore ͷಛੑʹ߹Θͤͯ࡞Ε͹ɺͦ͏ͳΔ
 • ݁Ռ3: Մ༻ੑ → ˕ྑ͍
  22. 25.

    GAE/Go ࠾༻ͷ݁Ռ4 : αϙʔτମ੍ 25 • ݁Ռ4 : αϙʔτମ੍
 •

    ࣄલʹ৘ใΛूΊͯαϙʔτମ੍ʹ͍ͭͯ͸Α͘Θ͔Βͳ͔ͬͨ ͷͰɺݸਓతʹ͸Ұ൪ݒ೦ͩͬͨ఺ • Google ͞ΜͱͷϛʔςΟϯάΛ܁Γฦͨ͠ΓɺGCP ͷ༗ঈαϙʔ τʢGoldϓϥϯʣʹೖΔ͜ͱͰɺॆ࣮ͨ͠ମ੍͕ݟ͖͑ͯͨ
  23. 26.

    GAE/Go ࠾༻ͷ݁Ռ4 : αϙʔτମ੍ 26 • ϝϧΧϦͷ஍ͷརɿಉ͡Ϗϧʹ Google ͞Μ͕͍ΔͷͰɺࠔͬͨͱ ͖ʹ͙͢ʹ௚઀࿩ͯ͠৘ใަ׵Ͱ͖Δ

    → Ӧۀ୲౰ऀ΍ٕज़୲౰ऀ͕ͨ͘͞Μ͍ΔͷͰɺଞͷϏϧͷօ͞ ·΋΄΅ಉ༷ͷαϙʔτ͸ड͚ΒΕΔ(͸ͣ) • GCP ͷ༗ঈαϙʔτɺߴ౓ͳٕज़తͳ࣭໰ʹରͯ͠΋1࣍ճ౴͸ ౰೔ʹདྷͨΓɺ஗ͯ͘΋2೔Ҏ಺ʹ໰୊͕ղܾ͢Δ • ଞͷબ୒ࢶɿτοϓήʔτ͞ΜͷΑ͏ͳ GCP ύʔτφʔاۀ • ݁Ռ4: αϙʔτମ੍ → ˕ྑ͍
  24. 27.

    GAE/Go ࠾༻ͷ݁Ռ5 : ίετ 27 • ݁Ռ5 : ίετ
 •

    աڈʹ͸ར༻ྉ͕ۚߴֹͩͬͨ࿩Λฉ͍ͨΓ͢Δ • աڈ͸Ұ୴๨Εͯɺ͍·࢖͏ͱͲ͏͍͏ֹۚʹͳΔͷ͔Λ஌Δ • ݱࡏ͸ۃΊͯ௿ίετʹͳ͍ͬͯΔ
  25. 28.

    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%
  26. 29.

    GAE/Go ࠾༻ͷ݁Ռ5 : ίετ 29 • Πϯϑϥઐ೚ͷΤϯδχΞ͕͍ͳͯ͘΋ӡ༻Ͱ͖ΔͨΊɺΠϯϑ ϥΛҡ࣋͢Δਓ݅අ΋͔͔͍ͬͯͳ͍ • ΦϯϓϨϛεΛؚΊͨଞͷͲͷΑ͏ͳΠϯϑϥ؀ڥͰ΋ɺ


    GCP ΑΓ҆ՁʹαʔϏεΛ࡞Δ͜ͱ͸Ͱ͖ͳ͍ • ͢΂ͯैྔ՝ۚɻϢʔβ਺͕૿͑Ε͹අ༻͸ਖ਼ൺྫ͢ΔɻϦβʔϒ υΠϯελϯεͷΑ͏ͳɺܭըੑ͕ඞཁͳ΋ͷ͸ͳ͘ɺৗʹ҆Ձ ͳঢ়ଶ • ݁Ռ5: ίετ → ˕ྑ͍