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