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

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

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

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

Tatsuya Tsuruoka

April 20, 2016
Tweet

More Decks by Tatsuya Tsuruoka

Other Decks in Programming

Transcript

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

    View Slide

  2. ࣗݾ঺հ
    2
    ௽Ԭ ୡ໵
    • ι΢κ΢ɺαʔόαΠυΤϯδχΞ݉
    Ϛωʔδϟʔ
    • ϝϧΧϦɺ૑ۀ͔࣌ΒόοΫΤϯυͷ
    ΤϯδχΞϦϯάΛ୲౰
    • ։ൃऀָ͕͘͠࢓ࣄͰ͖Δ৔Λ࡞Δͷ
    ͕޷͖

    View Slide

  3. ࠓճ͓఻͍͑ͨ͜͠ͱ
    3
    1. Go ͱ GAE ͸ඇৗʹ༗ྗͳ Web ΞϓϦ։ൃखஈ
    2. PaaS ͷ࣌୅͕ຊ֨తʹ࢝·͖ͬͯͨ

    View Slide

  4. INDEX
    Why Goʁ Why GAEʁ
    ෼ࢄγεςϜͷͨΊͷ Datastore
    Web ΞϓϦέʔγϣϯͷΞʔΩςΫνϟ

    View Slide

  5. Why Go? Why GAE?
    5
    • Ξοςͷ։ൃΛ GAE/Go ʹܾΊͨཧ༝
    ΞϓϦέʔγϣϯͷཁ݅ ϝϧΧϦͰ͸ͳ͘ι΢κ΢
    (PPHMFͷಈ͖ ϓϩμΫτ։ൃ΁ϑΥʔΧε

    View Slide

  6. ΞϓϦέʔγϣϯͷཁ݅
    6
    • ػೳతͳଆ໘

    JSON APIɺ੩తίϯςϯπ഑৴ʢHTML/CSS/JSʣɺಈతίϯςϯπੜ੒ɺ

    σʔλϕʔε(ӬଓԽɺΫΤϦ)ɺΩϡʔॲཧɺ

    ݕࡧ(ΩʔɺશจݕࡧɺҐஔɺ༧ଌม׵)ɺ

    ը૾Ξοϓϩʔυͱ഑৴ɺϝʔϧૹ৴ɺPush ௨஌ɺσʔλ෼ੳ

    View Slide

  7. ΞϓϦέʔγϣϯͷཁ݅
    7
    • ඇػೳతͳଆ໘
    • άϩʔόϧ
    • ෳ਺Ϧʔδϣϯ(USɺEUɺAPAC)ͰαʔϏεΛల։͍ͨ͠

    ͦͷͱ͖σʔλϕʔε͸άϩʔόϧʹͻͱ͚ͭͩ
    • େن໛ΞϓϦέʔγϣϯ
    • DAU ਺ઍສਓن໛Λѻ͑ΔΞʔΩςΫνϟΛߟ͍͑ͨ
    • ࢀߟɿݱࡏͷϝϧΧϦ͕೔ถ3500ສμ΢ϯϩʔυɻ

    ϐʔΫ࣌ຖ෼120ສϦΫΤετɻѻ͏σʔλྔ͸ԯ୯Ґ
    • ϋΠεέʔϥϒϧ
    • ্ཱͪ͛ظ͔ؒΒ࠷ޙ·ͰҰ؏ͨ͠ΞʔΩςΫνϟʹ͍ͨ͠

    View Slide

  8. ϝϧΧϦͰ͸ͳ͘ι΢κ΢
    8
    • େ୾ͳٕज़બఆ͕Ͱ͖ͨେ͖ͳཧ༝ͷͻͱͭ
    • ϝϧΧϦͷࢠձࣾͱ্ཱ͕ͯͪͬͨ͠ܦҢ͕͋Γɺ

    ಉٕ͡ज़Λ͋͑ͯબ͹ͳ͍ͱ͍͏બ୒ࢶ΋ߟ͑ͯΈΔ
    • ϝϧΧϦͷLAMPελοΫͰ͸ͳ͍ͱͨ͠ΒɺͲΜͳબ୒ࢶʹͳΔʁ

    View Slide

  9. ϝϧΧϦͰ͸ͳ͘ι΢κ΢
    9
    • ϓϩμΫτͷϦϦʔε͸͢
    ΂ͯʹ༏ઌ͞ΕΔ
    • ݶΒΕͨϦιʔε

    ʢਓɺ͓ۚɺ࣌ؒʣ
    • ͍·ूΊΒΕΔՄೳੑͷߴ
    ͍ΤϯδχΞ͸ʁ
    • → อकతʹˍݎ࿚ʹ
    • ϝϧΧϦ͚ͩͰ͸ੜΈग़ͤ
    ͳ͍৽͍͠Ձ஋Λग़͍ͨ͠
    • ५୔ͳϦιʔε
    • 3೥ޙʹ΋ΤϯδχΞʹͱͬ
    ͯັྗతͳ৔ॴͰ͋ΔͨΊ
    ʹ͸ʁ
    • → ଟ༷ੑͱٕज़ͷ։୓
    ϝϧΧϦॳظ ι΢κ΢

    View Slide

  10. Google ͷಈ͖
    10
    • ΞοςͷΠϯϑϥΛߟ͑Δͱ͖ʹɺϝϧΧϦͱಉ͡ΦϯϓϨϛε΍AWSҎ֎
    ͷબ୒ࢶ΋ௐࠪ
    • Google Cloud Platform Ͱྑ͍੒ՌΛग़ͤͨͱ͍͏৘ใΛಘͨɻ͙͢ʹ

    Google ͷ୲౰ऀΛ঺հͯ͠΋Β͍ɺGCP/GAE ͷ࠾༻ՄೳੑΛ1ϲ݄΄Ͳݕূ
    • Google ʹΑΔ͖Ίࡉ͔ͳαϙʔτମ੍
    • 5೥͘Β͍લͱ͸༷ࢠ͕ҧ͏
    • AWS ͕೔ຊϦʔδϣϯΛग़͖ͯͨ͠ͱ͖ͷΑ͏ͳงғؾ͕͋ͬͨ
    • Google Cloud Platform ʹରͯ͠ඇৗʹଟ͘ͷϦιʔεΛ౤Լ͍ͯ͠Δ

    View Slide

  11. ϓϩμΫτ։ൃ΁ϑΥʔΧε
    11
    • ΤϯδχΞͷଟ͕͘

    ։ൃݴޠ΍Πϯϑϥಛ༗ͷ໰୊ʹ࣌ؒΛ࢖͏ͷͰ͸ͳ͘ɺ

    ϓϩμΫτͷ։ൃʹूதͰ͖Δ؀ڥ͕ཧ૝ɺͱ͍͏؍఺

    View Slide

  12. ϓϩμΫτ։ൃ΁ϑΥʔΧε - Golang
    12
    • Go ͷੜ࢈ੑ΍ύϑΥʔϚϯε͸ʁ
    • ϝϧΧϦͰ GaurunʢPush ഑৴ϛυϧ΢ΣΞʣͳͲͷ࣮੷͕͋Γɺ

    Go ͷϙςϯγϟϧͷߴ͞͸ײ͍ͯͨ͡
    • ݕূϙΠϯτɿϛυϧ΢ΣΞ͚ͩͰ͸ͳ͘ Web Ͱ΋ߴ͍ੜ࢈ੑΛग़ͤΔ͔
    • LL ͱ͸ҧ͏ੜ࢈ੑͷग़͠ํ͕Ͱ͖Δ
    • ॳ଎΍ॻࣺͯͷૣ͞͸ LL ʹྼΓ͕ͪɻ௕͍໨ͰݟΕ͹ੜ࢈ੑ͸ߴ͘ײ͡
    ͨɻݫ֨ͳܕγεςϜ͕͋ΔͷͰେ୾ͳมߋ΋҆৺ͯ͠Ͱ͖Δ
    • νʔϜ։ൃͷ͠΍͢͞
    • go fmtɺgo doc

    View Slide

  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

    View Slide

  14. ϓϩμΫτ։ൃ΁ϑΥʔΧε - GAE
    14
    • Ϟδϡʔϧͱόʔδϣϯ
    • ΞϓϦέʔγϣϯΛෳ਺ͷ؀ڥʹσϓϩΠͰ͖Δ = όʔδϣϯͱݺ͹ΕΔ
    • όʔδϣϯʹରͯ͠τϥϑΟοΫͷৼΓ෼͚ΛઃఆͰ͖Δ
    • ཧ૝తͳ Blue / Green σϓϩΠ
    ग़యɿIUUQTDMPVEHPPHMFDPNTPMVUJPOTNJDSPTFSWJDFTPOBQQFOHJOF

    View Slide

  15. ཧ૝తͳ Blue/Green σϓϩΠ
    15


    View Slide

  16. ϓϩμΫτ։ൃ΁ϑΥʔΧε - GAE
    16
    • ΠϯελϯεͷΦʔτεέʔϧ
    • App Engine ʹΞϓϦέʔγϣϯΛσϓϩΠ͢Δ͚ͩͰΦʔτεέʔϧ͢Δ
    • ΞΫηε͕ͳ͚Ε͹Πϯελϯε͸্ཱ͕ͪΒͣɺ

    ΞΫηε͕͋ͬͨͱ͖ʹ্ཱ͕ͪΔ
    • Πϯελϯε͸ VM Ͱ͸ͳܰ͘ྔίϯςφ
    • Go ͷΠϯελϯεͳΒىಈ͸200msҎԼ
    • طଘΞϓϦ͔Βͷྲྀ͜͠Έ΍େن໛ͳ޿ࠂϓϩϞʔγϣϯͰ΋ɺ

    Կ΋͠ͳͯ͘΋ॠ࣌ʹΠϯελϯε͕૿͑ͯॲཧ͞ΕΔ

    View Slide

  17. GAE ͷΦʔτεέʔϧ
    17

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  21. ӬଓԽσʔλΛͲ͏΍ͬͯεέʔϧͤ͞Δ͔
    21
    • Ҋ1) RDB ʹΑΔ఻౷తͳ Master/Slave Ϟσϧ
    • ࣮੷े෼Ͱཱ֬͞Εͨख๏
    • ͱ͸͍͑ DB Λθϩ͔Β্ཱͪ͛ͯεέʔϧ͍ͤͯ͘͞ͷ͸େม
    • େن໛ͳσʔλʹͳΔ΄Ͳ RDB ຊདྷͷ࣋ͪຯ͸ੜ͔ͤͳ͘ͳΔ
    • ҟͳΔ DB ςʔϒϧͱͷτϥϯβΫγϣϯ͕Ͱ͖ͳ͍ɻJOIN ͕ݶఆత
    • Ϣʔβ਺ͷ্ݶ͕Θ͔͍ͬͯΔ৔߹͸͜ΕͰ OK
    • → GCP Ͱ͸ Cloud SQL ͕ఏڙ͞Ε͍ͯΔ

    View Slide

  22. ӬଓԽσʔλΛͲ͏΍ͬͯεέʔϧͤ͞Δ͔
    22
    • Ҋ2) εέʔϥϏϦςΟΛॏࢹͨ͠ NoSQL Ϟσϧ
    • NoSQL σʔλϕʔε "Datastore"
    • τϨʔυΦϑɿ
    • ࣮༻తͳ ACID ͸͖͋ΒΊΔ
    • ۃΊͯߴ͍εέʔϥϏϦςΟ

    View Slide

  23. RDB ͱ NoSQL ͲͪΒΛબͿ΂͖͔ʁ
    23
    • ؒҧ͍ͳ͘ɺGAE ͷσʔλϕʔεʹ͸ Datastore ΛબͿ΂͖
    • Gmail ΍ YouTube ͷΑ͏ͳαʔϏεͷσʔλ͸ RDB Ͱ͸ͳ͘

    BigTable ʹอଘ͞Ε͍ͯΔ
    • NoSQL ͷ࣮੷͸ Google ͕࣮ূࡁΈ
    • Ξος΋΋ͪΖΜ RDB Λ࢖Θͣ Datastore Λར༻
    • ௕͍͜ͱ׳Ε਌͠ΜͰ͖ͨ RDB Ͱ͸ͳ͘ɺNoSQL ΛબͿܾஅ͸೉͍͠
    • ͔͠͠άϩʔόϧϨϕϧͷେن໛αʔϏεΛ࡞ΔͨΊʹ

    NoSQL ΛબͿܾஅΛ͠Α͏

    View Slide

  24. Datastore ͷಛ௃
    24
    • ΦϒδΣΫτߏ଄Λ࣋ͭεΩʔϚϨεͳ Key-Value Store ʹ

    ୯७ͳΫΤϦʹΑΔݕࡧΛՃ͑ͨ΋ͷ
    • BigTable ͷ্ʹߏங͞Ε͍ͯΔ
    • BigTable ͸୯७ͳ KVSʢΩʔΛݩʹͨ͠ߦ୯Ґͷ CRUD + Ωʔͷൣғݕࡧʣ

    View Slide

  25. Datastore ͷಛ௃
    25
    • Pros
    • ۃΊͯߴ͍εέʔϥϏϦςΟ
    • ӬଓԽͰ͖ΔσʔλʢΤϯςΟςΟʣͷ਺ʹ੍ݶ͸ͳ͍
    • ӬଓԽσʔλ͕ͲΕ͚ͩ૿͑ͯ΋औಘͱ௥Ճͷ଎౓͸ྼԽ͠ͳ͍
    • 1݅Ͱ΋10ԯ݅Ͱ΋ಉ͡
    • ಉҰΤϯςΟςΟͰͳ͚Ε͹੍ݶͳ͠ͷฒྻॻ͖ࠐΈ
    • ۃΊͯߴ͍Մ༻ੑ
    • μ΢ϯλΠϜͳ͠
    • Cons
    • BigTable ΑΓߴػೳͱ͸͍͑ϓϦϛςΟϒ
    • ݶఆ͞Εͨ৚݅Ͱ͔͠ ACID τϥϯβΫγϣϯ͕αϙʔτ͞Εͳ͍
    • JOIN ͕ͳ͍ɺू໿ؔ਺͕ͳ͍ɺetc.

    View Slide

  26. Datastore Λ࢖͏ͱ͖ʹߟ͑Δ͜ͱ
    26
    • RDB ͷύλʔϯΛͦͷ··౰ͯ͸ΊΔ͜ͱ͸Ͱ͖ͳ͍
    • ྫ1) τϥϯβΫγϣϯͳ͠Ͱෳ਺ͷ஋ΛҰ؏ੑΛ࣋ͨͤͯߋ৽
    • → Ұ࣌తʹҰ؏ੑ͕ͳ͘ͳΔ͜ͱΛڐ༰͢Δ
    • ྫ2) ΦʔτΠϯΫϦϝϯτʢ୯ௐ૿Ճ͢Δ਺஋ͷ࠾൪ʣ
    • → Datastore ͷػೳ͚ͩͰεέʔϧ͢Δ࠾൪͸࣮૷Ͱ͖ͳ͍
    • ෼ࢄγεςϜͰͷΦʔτΠϯΫϦϝϯτͷߟ͑ํ͕ඞཁ

    View Slide

  27. 8FCΞϓϦέʔγϣϯͷΞʔΩςΫνϟ

    View Slide

  28. Web ΞϓϦέʔγϣϯͷΞʔΩςΫνϟ
    28
    • Go Ͱ Web ΞϓϦΛ࡞Δ͜ͱ͸Ͱ͖Δʁ → Ͱ͖Δ
    • ͲΜͳϑϨʔϜϫʔΫΛ࢖͏ʁ → net/http?
    • ੜ࢈ੑ͸ʁ → ʁʁʁ
    Α͘ฉ͔ΕΔ͜ͱ

    View Slide

  29. ΞοςͷΞʔΩςΫνϟ
    29
    • ΞϓϦέʔγϣϯ͸ෳ਺ݸͷϞδϡʔϧͰߏ੒͞ΕΔ
    • APIɺWebɺCS toolɺetc.
    • Ϟδϡʔϧ͸ͦͷ··σϓϩΠ୯Ґ
    • ୯ҰͷϦϙδτϦ(monorepo)Ͱɺଟ͘ͷίʔυ͸ڞ௨
    • API ͸ JSON RPC 2.0
    • Web ͱ CS tool ͸ HTML Λಈతੜ੒͢Δ
    • ΞϓϦέʔγϣϯ૚ɺυϝΠϯ૚ɺUI૚ɺΠϯϑϥ૚ͷ4૚ʹ෼͔Ε͍ͯͯɺ
    ֤Ϟδϡʔϧ͸ UI ૚ͷҧ͍ͱͯ͠දݱ͍ͯ͠Δ

    View Slide

  30. ΞοςͷΞϓϦέʔγϣϯͷઃܭํ਑
    30
    • GAE ΁ͷґଘ
    • GAE ͷػೳΛϑϧʹ׆༻͢Δ͜ͱͰεέʔϥϏϦςΟ΍Մ༻ੑͷԸܙΛड
    ͚͍ͯΔ
    • ౰વɺڧྗʹϩοΫΠϯ͞ΕΔ͜ͱʹͳΔ
    • ͞͞΍͔ͳ఍߅ɿυϝΠϯ૚ʢϏδωεϩδοΫʣͱΠϯϑϥ૚Λ෼͚
    ͯɺυϝΠϯ૚Λ GAE ʹґଘ͠ͳ͍Α͏ʹ͍ͯ͠Δ
    • Datastore Λར༻͢Δ Repository Λ AWS ͷ DynamoDB Λར༻͢Δ
    Repository ʹࠩ͠ସ͑Α͏ͱࢥ͑͹Ͱ͖Δ

    View Slide

  31. ΞοςͷΞϓϦέʔγϣϯͷઃܭํ਑
    31
    • Go ͷߟ͑ํʹै͏
    • ίʔυͷॻ͖ํͷΑ͏ͳࡉ͔͍͜ͱ
    • ύοέʔδΛͲ͏؅ཧ͢Δ͔
    • ॏްͳϑϨʔϜϫʔΫΛಋೖ͠ͳ͍
    • x/net/context ͱ net/http ύοέʔδ
    • 1ͭͷϦϙδτϦʹ͢΂ͯΛೖΕΔʢmonorepoʣ
    • APIɺWebɺCStool ͷΑ͏ͳڥք͕ҟͳΓͦ͏ͳϓϩδΣΫτΛɺ୯Ұϓ
    ϩδΣΫτͱͯ͠ѻ͏
    • ڞ௨෦඼Λѻ͍΍͘͢ͳͬͯɺґଘؔ܎؅ཧ΋؆୯ʹͳΔ
    • ԣஅతͳίʔυͷվमΛ͠΍͘͢ͳΔ

    View Slide

  32. ·ͱΊ
    32
    1. Go ͱ GAE ͸ඇৗʹ༗ྗͳ Web ΞϓϦ։ൃखஈ
    2. PaaS ͷ࣌୅͕ຊ֨తʹ࢝·͖ͬͯͨ


    → ͥͻ GAE/Go Λମݧͯ͠Έ͍ͯͩ͘͞

    View Slide