アッテ開発の技術 : Golang と Google App Engine

アッテ開発の技術 : Golang と Google App Engine

2016年4月18日開催のアッテフェスでの発表です。

4ea490210007ad68a5911217523bd137?s=128

Tatsuya Tsuruoka

April 20, 2016
Tweet

Transcript

  1. ։ൃͷٕज़ 2016/04/18 (PMBOHͱ(PPHMF"QQ&OHJOF

  2. ࣗݾ঺հ 2 ௽Ԭ ୡ໵ • ι΢κ΢ɺαʔόαΠυΤϯδχΞ݉ Ϛωʔδϟʔ • ϝϧΧϦɺ૑ۀ͔࣌ΒόοΫΤϯυͷ ΤϯδχΞϦϯάΛ୲౰

    • ։ൃऀָ͕͘͠࢓ࣄͰ͖Δ৔Λ࡞Δͷ ͕޷͖
  3. ࠓճ͓఻͍͑ͨ͜͠ͱ 3 1. Go ͱ GAE ͸ඇৗʹ༗ྗͳ Web ΞϓϦ։ൃखஈ 2.

    PaaS ͷ࣌୅͕ຊ֨తʹ࢝·͖ͬͯͨ
  4. INDEX Why Goʁ Why GAEʁ ෼ࢄγεςϜͷͨΊͷ Datastore Web ΞϓϦέʔγϣϯͷΞʔΩςΫνϟ

  5. Why Go? Why GAE? 5 • Ξοςͷ։ൃΛ GAE/Go ʹܾΊͨཧ༝ ΞϓϦέʔγϣϯͷཁ݅

    ϝϧΧϦͰ͸ͳ͘ι΢κ΢ (PPHMFͷಈ͖ ϓϩμΫτ։ൃ΁ϑΥʔΧε
  6. ΞϓϦέʔγϣϯͷཁ݅ 6 • ػೳతͳଆ໘
 JSON APIɺ੩తίϯςϯπ഑৴ʢHTML/CSS/JSʣɺಈతίϯςϯπੜ੒ɺ
 σʔλϕʔε(ӬଓԽɺΫΤϦ)ɺΩϡʔॲཧɺ
 ݕࡧ(ΩʔɺશจݕࡧɺҐஔɺ༧ଌม׵)ɺ
 ը૾Ξοϓϩʔυͱ഑৴ɺϝʔϧૹ৴ɺPush ௨஌ɺσʔλ෼ੳ

  7. ΞϓϦέʔγϣϯͷཁ݅ 7 • ඇػೳతͳଆ໘ • άϩʔόϧ • ෳ਺Ϧʔδϣϯ(USɺEUɺAPAC)ͰαʔϏεΛల։͍ͨ͠
 ͦͷͱ͖σʔλϕʔε͸άϩʔόϧʹͻͱ͚ͭͩ •

    େن໛ΞϓϦέʔγϣϯ • DAU ਺ઍສਓن໛Λѻ͑ΔΞʔΩςΫνϟΛߟ͍͑ͨ • ࢀߟɿݱࡏͷϝϧΧϦ͕೔ถ3500ສμ΢ϯϩʔυɻ
 ϐʔΫ࣌ຖ෼120ສϦΫΤετɻѻ͏σʔλྔ͸ԯ୯Ґ • ϋΠεέʔϥϒϧ • ্ཱͪ͛ظ͔ؒΒ࠷ޙ·ͰҰ؏ͨ͠ΞʔΩςΫνϟʹ͍ͨ͠
  8. ϝϧΧϦͰ͸ͳ͘ι΢κ΢ 8 • େ୾ͳٕज़બఆ͕Ͱ͖ͨେ͖ͳཧ༝ͷͻͱͭ • ϝϧΧϦͷࢠձࣾͱ্ཱ͕ͯͪͬͨ͠ܦҢ͕͋Γɺ
 ಉٕ͡ज़Λ͋͑ͯબ͹ͳ͍ͱ͍͏બ୒ࢶ΋ߟ͑ͯΈΔ • ϝϧΧϦͷLAMPελοΫͰ͸ͳ͍ͱͨ͠ΒɺͲΜͳબ୒ࢶʹͳΔʁ

  9. ϝϧΧϦͰ͸ͳ͘ι΢κ΢ 9 • ϓϩμΫτͷϦϦʔε͸͢ ΂ͯʹ༏ઌ͞ΕΔ • ݶΒΕͨϦιʔε
 ʢਓɺ͓ۚɺ࣌ؒʣ • ͍·ूΊΒΕΔՄೳੑͷߴ

    ͍ΤϯδχΞ͸ʁ • → อकతʹˍݎ࿚ʹ • ϝϧΧϦ͚ͩͰ͸ੜΈग़ͤ ͳ͍৽͍͠Ձ஋Λग़͍ͨ͠ • ५୔ͳϦιʔε • 3೥ޙʹ΋ΤϯδχΞʹͱͬ ͯັྗతͳ৔ॴͰ͋ΔͨΊ ʹ͸ʁ • → ଟ༷ੑͱٕज़ͷ։୓ ϝϧΧϦॳظ ι΢κ΢
  10. Google ͷಈ͖ 10 • ΞοςͷΠϯϑϥΛߟ͑Δͱ͖ʹɺϝϧΧϦͱಉ͡ΦϯϓϨϛε΍AWSҎ֎ ͷબ୒ࢶ΋ௐࠪ • Google Cloud Platform

    Ͱྑ͍੒ՌΛग़ͤͨͱ͍͏৘ใΛಘͨɻ͙͢ʹ
 Google ͷ୲౰ऀΛ঺հͯ͠΋Β͍ɺGCP/GAE ͷ࠾༻ՄೳੑΛ1ϲ݄΄Ͳݕূ • Google ʹΑΔ͖Ίࡉ͔ͳαϙʔτମ੍ • 5೥͘Β͍લͱ͸༷ࢠ͕ҧ͏ • AWS ͕೔ຊϦʔδϣϯΛग़͖ͯͨ͠ͱ͖ͷΑ͏ͳงғؾ͕͋ͬͨ • Google Cloud Platform ʹରͯ͠ඇৗʹଟ͘ͷϦιʔεΛ౤Լ͍ͯ͠Δ
  11. ϓϩμΫτ։ൃ΁ϑΥʔΧε 11 • ΤϯδχΞͷଟ͕͘
 ։ൃݴޠ΍Πϯϑϥಛ༗ͷ໰୊ʹ࣌ؒΛ࢖͏ͷͰ͸ͳ͘ɺ
 ϓϩμΫτͷ։ൃʹूதͰ͖Δ؀ڥ͕ཧ૝ɺͱ͍͏؍఺

  12. ϓϩμΫτ։ൃ΁ϑΥʔΧε - Golang 12 • Go ͷੜ࢈ੑ΍ύϑΥʔϚϯε͸ʁ • ϝϧΧϦͰ GaurunʢPush

    ഑৴ϛυϧ΢ΣΞʣͳͲͷ࣮੷͕͋Γɺ
 Go ͷϙςϯγϟϧͷߴ͞͸ײ͍ͯͨ͡ • ݕূϙΠϯτɿϛυϧ΢ΣΞ͚ͩͰ͸ͳ͘ Web Ͱ΋ߴ͍ੜ࢈ੑΛग़ͤΔ͔ • LL ͱ͸ҧ͏ੜ࢈ੑͷग़͠ํ͕Ͱ͖Δ • ॳ଎΍ॻࣺͯͷૣ͞͸ LL ʹྼΓ͕ͪɻ௕͍໨ͰݟΕ͹ੜ࢈ੑ͸ߴ͘ײ͡ ͨɻݫ֨ͳܕγεςϜ͕͋ΔͷͰେ୾ͳมߋ΋҆৺ͯ͠Ͱ͖Δ • νʔϜ։ൃͷ͠΍͢͞ • go fmtɺgo doc
  13. ϓϩμΫτ։ൃ΁ϑΥʔΧε - 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
  14. ϓϩμΫτ։ൃ΁ϑΥʔΧε - GAE 14 • Ϟδϡʔϧͱόʔδϣϯ • ΞϓϦέʔγϣϯΛෳ਺ͷ؀ڥʹσϓϩΠͰ͖Δ = όʔδϣϯͱݺ͹ΕΔ

    • όʔδϣϯʹରͯ͠τϥϑΟοΫͷৼΓ෼͚ΛઃఆͰ͖Δ • ཧ૝తͳ Blue / Green σϓϩΠ ग़యɿIUUQTDMPVEHPPHMFDPNTPMVUJPOTNJDSPTFSWJDFTPOBQQFOHJOF
  15. ཧ૝తͳ Blue/Green σϓϩΠ 15  

  16. ϓϩμΫτ։ൃ΁ϑΥʔΧε - GAE 16 • ΠϯελϯεͷΦʔτεέʔϧ • App Engine ʹΞϓϦέʔγϣϯΛσϓϩΠ͢Δ͚ͩͰΦʔτεέʔϧ͢Δ

    • ΞΫηε͕ͳ͚Ε͹Πϯελϯε͸্ཱ͕ͪΒͣɺ
 ΞΫηε͕͋ͬͨͱ͖ʹ্ཱ͕ͪΔ • Πϯελϯε͸ VM Ͱ͸ͳܰ͘ྔίϯςφ • Go ͷΠϯελϯεͳΒىಈ͸200msҎԼ • طଘΞϓϦ͔Βͷྲྀ͜͠Έ΍େن໛ͳ޿ࠂϓϩϞʔγϣϯͰ΋ɺ
 Կ΋͠ͳͯ͘΋ॠ࣌ʹΠϯελϯε͕૿͑ͯॲཧ͞ΕΔ
  17. GAE ͷΦʔτεέʔϧ 17

  18. ౷߹͞Ε͍ͯΔϦΞϧλΠϜͷϩάػೳ 18

  19. ౷߹͞Ε͍ͯΔϦΞϧλΠϜͷϩάػೳ - τϨʔε 19

  20. ෼ࢄγεςϜͷͨΊͷ%BUBTUPSF

  21. ӬଓԽσʔλΛͲ͏΍ͬͯεέʔϧͤ͞Δ͔ 21 • Ҋ1) RDB ʹΑΔ఻౷తͳ Master/Slave Ϟσϧ • ࣮੷े෼Ͱཱ֬͞Εͨख๏

    • ͱ͸͍͑ DB Λθϩ͔Β্ཱͪ͛ͯεέʔϧ͍ͤͯ͘͞ͷ͸େม • େن໛ͳσʔλʹͳΔ΄Ͳ RDB ຊདྷͷ࣋ͪຯ͸ੜ͔ͤͳ͘ͳΔ • ҟͳΔ DB ςʔϒϧͱͷτϥϯβΫγϣϯ͕Ͱ͖ͳ͍ɻJOIN ͕ݶఆత • Ϣʔβ਺ͷ্ݶ͕Θ͔͍ͬͯΔ৔߹͸͜ΕͰ OK • → GCP Ͱ͸ Cloud SQL ͕ఏڙ͞Ε͍ͯΔ
  22. ӬଓԽσʔλΛͲ͏΍ͬͯεέʔϧͤ͞Δ͔ 22 • Ҋ2) εέʔϥϏϦςΟΛॏࢹͨ͠ NoSQL Ϟσϧ • NoSQL σʔλϕʔε

    "Datastore" • τϨʔυΦϑɿ • ࣮༻తͳ ACID ͸͖͋ΒΊΔ • ۃΊͯߴ͍εέʔϥϏϦςΟ
  23. RDB ͱ NoSQL ͲͪΒΛબͿ΂͖͔ʁ 23 • ؒҧ͍ͳ͘ɺGAE ͷσʔλϕʔεʹ͸ Datastore ΛબͿ΂͖

    • Gmail ΍ YouTube ͷΑ͏ͳαʔϏεͷσʔλ͸ RDB Ͱ͸ͳ͘
 BigTable ʹอଘ͞Ε͍ͯΔ • NoSQL ͷ࣮੷͸ Google ͕࣮ূࡁΈ • Ξος΋΋ͪΖΜ RDB Λ࢖Θͣ Datastore Λར༻ • ௕͍͜ͱ׳Ε਌͠ΜͰ͖ͨ RDB Ͱ͸ͳ͘ɺNoSQL ΛબͿܾஅ͸೉͍͠ • ͔͠͠άϩʔόϧϨϕϧͷେن໛αʔϏεΛ࡞ΔͨΊʹ
 NoSQL ΛબͿܾஅΛ͠Α͏
  24. Datastore ͷಛ௃ 24 • ΦϒδΣΫτߏ଄Λ࣋ͭεΩʔϚϨεͳ Key-Value Store ʹ
 ୯७ͳΫΤϦʹΑΔݕࡧΛՃ͑ͨ΋ͷ •

    BigTable ͷ্ʹߏங͞Ε͍ͯΔ • BigTable ͸୯७ͳ KVSʢΩʔΛݩʹͨ͠ߦ୯Ґͷ CRUD + Ωʔͷൣғݕࡧʣ
  25. Datastore ͷಛ௃ 25 • Pros • ۃΊͯߴ͍εέʔϥϏϦςΟ • ӬଓԽͰ͖ΔσʔλʢΤϯςΟςΟʣͷ਺ʹ੍ݶ͸ͳ͍ •

    ӬଓԽσʔλ͕ͲΕ͚ͩ૿͑ͯ΋औಘͱ௥Ճͷ଎౓͸ྼԽ͠ͳ͍ • 1݅Ͱ΋10ԯ݅Ͱ΋ಉ͡ • ಉҰΤϯςΟςΟͰͳ͚Ε͹੍ݶͳ͠ͷฒྻॻ͖ࠐΈ • ۃΊͯߴ͍Մ༻ੑ • μ΢ϯλΠϜͳ͠ • Cons • BigTable ΑΓߴػೳͱ͸͍͑ϓϦϛςΟϒ • ݶఆ͞Εͨ৚݅Ͱ͔͠ ACID τϥϯβΫγϣϯ͕αϙʔτ͞Εͳ͍ • JOIN ͕ͳ͍ɺू໿ؔ਺͕ͳ͍ɺetc.
  26. Datastore Λ࢖͏ͱ͖ʹߟ͑Δ͜ͱ 26 • RDB ͷύλʔϯΛͦͷ··౰ͯ͸ΊΔ͜ͱ͸Ͱ͖ͳ͍ • ྫ1) τϥϯβΫγϣϯͳ͠Ͱෳ਺ͷ஋ΛҰ؏ੑΛ࣋ͨͤͯߋ৽ •

    → Ұ࣌తʹҰ؏ੑ͕ͳ͘ͳΔ͜ͱΛڐ༰͢Δ • ྫ2) ΦʔτΠϯΫϦϝϯτʢ୯ௐ૿Ճ͢Δ਺஋ͷ࠾൪ʣ • → Datastore ͷػೳ͚ͩͰεέʔϧ͢Δ࠾൪͸࣮૷Ͱ͖ͳ͍ • ෼ࢄγεςϜͰͷΦʔτΠϯΫϦϝϯτͷߟ͑ํ͕ඞཁ
  27. 8FCΞϓϦέʔγϣϯͷΞʔΩςΫνϟ

  28. Web ΞϓϦέʔγϣϯͷΞʔΩςΫνϟ 28 • Go Ͱ Web ΞϓϦΛ࡞Δ͜ͱ͸Ͱ͖Δʁ → Ͱ͖Δ

    • ͲΜͳϑϨʔϜϫʔΫΛ࢖͏ʁ → net/http? • ੜ࢈ੑ͸ʁ → ʁʁʁ Α͘ฉ͔ΕΔ͜ͱ
  29. ΞοςͷΞʔΩςΫνϟ 29 • ΞϓϦέʔγϣϯ͸ෳ਺ݸͷϞδϡʔϧͰߏ੒͞ΕΔ • APIɺWebɺCS toolɺetc. • Ϟδϡʔϧ͸ͦͷ··σϓϩΠ୯Ґ •

    ୯ҰͷϦϙδτϦ(monorepo)Ͱɺଟ͘ͷίʔυ͸ڞ௨ • API ͸ JSON RPC 2.0 • Web ͱ CS tool ͸ HTML Λಈతੜ੒͢Δ • ΞϓϦέʔγϣϯ૚ɺυϝΠϯ૚ɺUI૚ɺΠϯϑϥ૚ͷ4૚ʹ෼͔Ε͍ͯͯɺ ֤Ϟδϡʔϧ͸ UI ૚ͷҧ͍ͱͯ͠දݱ͍ͯ͠Δ
  30. ΞοςͷΞϓϦέʔγϣϯͷઃܭํ਑ 30 • GAE ΁ͷґଘ • GAE ͷػೳΛϑϧʹ׆༻͢Δ͜ͱͰεέʔϥϏϦςΟ΍Մ༻ੑͷԸܙΛड ͚͍ͯΔ •

    ౰વɺڧྗʹϩοΫΠϯ͞ΕΔ͜ͱʹͳΔ • ͞͞΍͔ͳ఍߅ɿυϝΠϯ૚ʢϏδωεϩδοΫʣͱΠϯϑϥ૚Λ෼͚ ͯɺυϝΠϯ૚Λ GAE ʹґଘ͠ͳ͍Α͏ʹ͍ͯ͠Δ • Datastore Λར༻͢Δ Repository Λ AWS ͷ DynamoDB Λར༻͢Δ Repository ʹࠩ͠ସ͑Α͏ͱࢥ͑͹Ͱ͖Δ
  31. ΞοςͷΞϓϦέʔγϣϯͷઃܭํ਑ 31 • Go ͷߟ͑ํʹै͏ • ίʔυͷॻ͖ํͷΑ͏ͳࡉ͔͍͜ͱ • ύοέʔδΛͲ͏؅ཧ͢Δ͔ •

    ॏްͳϑϨʔϜϫʔΫΛಋೖ͠ͳ͍ • x/net/context ͱ net/http ύοέʔδ • 1ͭͷϦϙδτϦʹ͢΂ͯΛೖΕΔʢmonorepoʣ • APIɺWebɺCStool ͷΑ͏ͳڥք͕ҟͳΓͦ͏ͳϓϩδΣΫτΛɺ୯Ұϓ ϩδΣΫτͱͯ͠ѻ͏ • ڞ௨෦඼Λѻ͍΍͘͢ͳͬͯɺґଘؔ܎؅ཧ΋؆୯ʹͳΔ • ԣஅతͳίʔυͷվमΛ͠΍͘͢ͳΔ
  32. ·ͱΊ 32 1. Go ͱ GAE ͸ඇৗʹ༗ྗͳ Web ΞϓϦ։ൃखஈ 2.

    PaaS ͷ࣌୅͕ຊ֨తʹ࢝·͖ͬͯͨ
 
 → ͥͻ GAE/Go Λମݧͯ͠Έ͍ͯͩ͘͞