Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

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

Avatar for Tatsuya Tsuruoka

Tatsuya Tsuruoka

April 20, 2016
Tweet

More Decks by Tatsuya Tsuruoka

Other Decks in Programming

Transcript

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

    ϝϧΧϦͰ͸ͳ͘ι΢κ΢ (PPHMFͷಈ͖ ϓϩμΫτ։ൃ΁ϑΥʔΧε
  2. ΞϓϦέʔγϣϯͷཁ݅ 7 • ඇػೳతͳଆ໘ • άϩʔόϧ • ෳ਺Ϧʔδϣϯ(USɺEUɺAPAC)ͰαʔϏεΛల։͍ͨ͠
 ͦͷͱ͖σʔλϕʔε͸άϩʔόϧʹͻͱ͚ͭͩ •

    େن໛ΞϓϦέʔγϣϯ • DAU ਺ઍສਓن໛Λѻ͑ΔΞʔΩςΫνϟΛߟ͍͑ͨ • ࢀߟɿݱࡏͷϝϧΧϦ͕೔ถ3500ສμ΢ϯϩʔυɻ
 ϐʔΫ࣌ຖ෼120ສϦΫΤετɻѻ͏σʔλྔ͸ԯ୯Ґ • ϋΠεέʔϥϒϧ • ্ཱͪ͛ظ͔ؒΒ࠷ޙ·ͰҰ؏ͨ͠ΞʔΩςΫνϟʹ͍ͨ͠
  3. ϝϧΧϦͰ͸ͳ͘ι΢κ΢ 9 • ϓϩμΫτͷϦϦʔε͸͢ ΂ͯʹ༏ઌ͞ΕΔ • ݶΒΕͨϦιʔε
 ʢਓɺ͓ۚɺ࣌ؒʣ • ͍·ूΊΒΕΔՄೳੑͷߴ

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

    Ͱྑ͍੒ՌΛग़ͤͨͱ͍͏৘ใΛಘͨɻ͙͢ʹ
 Google ͷ୲౰ऀΛ঺հͯ͠΋Β͍ɺGCP/GAE ͷ࠾༻ՄೳੑΛ1ϲ݄΄Ͳݕূ • Google ʹΑΔ͖Ίࡉ͔ͳαϙʔτମ੍ • 5೥͘Β͍લͱ͸༷ࢠ͕ҧ͏ • AWS ͕೔ຊϦʔδϣϯΛग़͖ͯͨ͠ͱ͖ͷΑ͏ͳงғؾ͕͋ͬͨ • Google Cloud Platform ʹରͯ͠ඇৗʹଟ͘ͷϦιʔεΛ౤Լ͍ͯ͠Δ
  5. ϓϩμΫτ։ൃ΁ϑΥʔΧε - Golang 12 • Go ͷੜ࢈ੑ΍ύϑΥʔϚϯε͸ʁ • ϝϧΧϦͰ GaurunʢPush

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

    • όʔδϣϯʹରͯ͠τϥϑΟοΫͷৼΓ෼͚ΛઃఆͰ͖Δ • ཧ૝తͳ Blue / Green σϓϩΠ ग़యɿIUUQTDMPVEHPPHMFDPNTPMVUJPOTNJDSPTFSWJDFTPOBQQFOHJOF
  8. ϓϩμΫτ։ൃ΁ϑΥʔΧε - GAE 16 • ΠϯελϯεͷΦʔτεέʔϧ • App Engine ʹΞϓϦέʔγϣϯΛσϓϩΠ͢Δ͚ͩͰΦʔτεέʔϧ͢Δ

    • ΞΫηε͕ͳ͚Ε͹Πϯελϯε͸্ཱ͕ͪΒͣɺ
 ΞΫηε͕͋ͬͨͱ͖ʹ্ཱ͕ͪΔ • Πϯελϯε͸ VM Ͱ͸ͳܰ͘ྔίϯςφ • Go ͷΠϯελϯεͳΒىಈ͸200msҎԼ • طଘΞϓϦ͔Βͷྲྀ͜͠Έ΍େن໛ͳ޿ࠂϓϩϞʔγϣϯͰ΋ɺ
 Կ΋͠ͳͯ͘΋ॠ࣌ʹΠϯελϯε͕૿͑ͯॲཧ͞ΕΔ
  9. ӬଓԽσʔλΛͲ͏΍ͬͯεέʔϧͤ͞Δ͔ 21 • Ҋ1) RDB ʹΑΔ఻౷తͳ Master/Slave Ϟσϧ • ࣮੷े෼Ͱཱ֬͞Εͨख๏

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

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

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

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

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

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

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

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

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

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

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