2016年4月18日開催のアッテフェスでの発表です。
։ൃͷٕज़2016/04/18(PMBOHͱ(PPHMF"QQ&OHJOF
View Slide
ࣗݾհ2Ԭ ୡ• ικɺαʔόαΠυΤϯδχΞ݉Ϛωʔδϟʔ• ϝϧΧϦɺۀ͔࣌ΒόοΫΤϯυͷΤϯδχΞϦϯάΛ୲• ։ൃऀָ͕͘͠ࣄͰ͖ΔΛ࡞Δͷ͕͖
ࠓճ͓͍͑ͨ͜͠ͱ31. Go ͱ GAE ඇৗʹ༗ྗͳ Web ΞϓϦ։ൃखஈ2. PaaS ͷ͕࣌ຊ֨తʹ࢝·͖ͬͯͨ
INDEXWhy Goʁ Why GAEʁࢄγεςϜͷͨΊͷ DatastoreWeb ΞϓϦέʔγϣϯͷΞʔΩςΫνϟ
Why Go? Why GAE?5• Ξοςͷ։ൃΛ GAE/Go ʹܾΊͨཧ༝ΞϓϦέʔγϣϯͷཁ݅ ϝϧΧϦͰͳ͘ικ(PPHMFͷಈ͖ ϓϩμΫτ։ൃϑΥʔΧε
ΞϓϦέʔγϣϯͷཁ݅6• ػೳతͳଆ໘ JSON APIɺ੩తίϯςϯπ৴ʢHTML/CSS/JSʣɺಈతίϯςϯπੜɺ σʔλϕʔε(ӬଓԽɺΫΤϦ)ɺΩϡʔॲཧɺ ݕࡧ(ΩʔɺશจݕࡧɺҐஔɺ༧ଌม)ɺ ը૾Ξοϓϩʔυͱ৴ɺϝʔϧૹ৴ɺPush ௨ɺσʔλੳ
ΞϓϦέʔγϣϯͷཁ݅7• ඇػೳతͳଆ໘• άϩʔόϧ• ෳϦʔδϣϯ(USɺEUɺAPAC)ͰαʔϏεΛల։͍ͨ͠ ͦͷͱ͖σʔλϕʔεάϩʔόϧʹͻͱ͚ͭͩ• େنΞϓϦέʔγϣϯ• DAU ઍສਓنΛѻ͑ΔΞʔΩςΫνϟΛߟ͍͑ͨ• ࢀߟɿݱࡏͷϝϧΧϦ͕ถ3500ສμϯϩʔυɻ ϐʔΫ࣌ຖ120ສϦΫΤετɻѻ͏σʔλྔԯ୯Ґ• ϋΠεέʔϥϒϧ• ্ཱͪ͛ظ͔ؒΒ࠷ޙ·ͰҰ؏ͨ͠ΞʔΩςΫνϟʹ͍ͨ͠
ϝϧΧϦͰͳ͘ικ8• େͳٕज़બఆ͕Ͱ͖ͨେ͖ͳཧ༝ͷͻͱͭ• ϝϧΧϦͷࢠձࣾͱ্ཱ͕ͯͪͬͨ͠ܦҢ͕͋Γɺ ಉٕ͡ज़Λ͋͑ͯબͳ͍ͱ͍͏બࢶߟ͑ͯΈΔ• ϝϧΧϦͷLAMPελοΫͰͳ͍ͱͨ͠ΒɺͲΜͳબࢶʹͳΔʁ
ϝϧΧϦͰͳ͘ικ9• ϓϩμΫτͷϦϦʔεͯ͢ʹ༏ઌ͞ΕΔ• ݶΒΕͨϦιʔε ʢਓɺ͓ۚɺ࣌ؒʣ• ͍·ूΊΒΕΔՄೳੑͷߴ͍ΤϯδχΞʁ• → อकతʹˍݎ࿚ʹ• ϝϧΧϦ͚ͩͰੜΈग़ͤͳ͍৽͍͠ՁΛग़͍ͨ͠• ५ͳϦιʔε• 3ޙʹΤϯδχΞʹͱͬͯັྗతͳॴͰ͋ΔͨΊʹʁ• → ଟ༷ੑͱٕज़ͷ։ϝϧΧϦॳظ ικ
Google ͷಈ͖10• ΞοςͷΠϯϑϥΛߟ͑Δͱ͖ʹɺϝϧΧϦͱಉ͡ΦϯϓϨϛεAWSҎ֎ͷબࢶௐࠪ• Google Cloud Platform Ͱྑ͍ՌΛग़ͤͨͱ͍͏ใΛಘͨɻ͙͢ʹ Google ͷ୲ऀΛհͯ͠Β͍ɺGCP/GAE ͷ࠾༻ՄೳੑΛ1ϲ݄΄Ͳݕূ• Google ʹΑΔ͖Ίࡉ͔ͳαϙʔτମ੍• 5͘Β͍લͱ༷ࢠ͕ҧ͏• AWS ͕ຊϦʔδϣϯΛग़͖ͯͨ͠ͱ͖ͷΑ͏ͳงғؾ͕͋ͬͨ• Google Cloud Platform ʹରͯ͠ඇৗʹଟ͘ͷϦιʔεΛԼ͍ͯ͠Δ
ϓϩμΫτ։ൃϑΥʔΧε11• ΤϯδχΞͷଟ͕͘ ։ൃݴޠΠϯϑϥಛ༗ͷʹ࣌ؒΛ͏ͷͰͳ͘ɺ ϓϩμΫτͷ։ൃʹूதͰ͖Δڥ͕ཧɺͱ͍͏؍
ϓϩμΫτ։ൃϑΥʔΧε - Golang12• Go ͷੜ࢈ੑύϑΥʔϚϯεʁ• ϝϧΧϦͰ GaurunʢPush ৴ϛυϧΣΞʣͳͲͷ࣮͕͋Γɺ Go ͷϙςϯγϟϧͷߴ͞ײ͍ͯͨ͡• ݕূϙΠϯτɿϛυϧΣΞ͚ͩͰͳ͘ Web Ͱߴ͍ੜ࢈ੑΛग़ͤΔ͔• LL ͱҧ͏ੜ࢈ੑͷग़͠ํ͕Ͱ͖Δ• ॳॻࣺͯͷૣ͞ LL ʹྼΓ͕ͪɻ͍ͰݟΕੜ࢈ੑߴ͘ײͨ͡ɻݫ֨ͳܕγεςϜ͕͋ΔͷͰେͳมߋ҆৺ͯ͠Ͱ͖Δ• νʔϜ։ൃͷ͢͠͞• go fmtɺgo doc
ϓϩμΫτ։ൃϑΥʔΧε - GAE13• 1ͭͷ GCP ϓϩδΣΫτʹ 1ͭͷ App Engine• App Engine ͷதʹΞϓϦέʔγϣϯ͕Քಇ͢ΔΠϯελϯε͕͋Δ• ݕࡧػೳΩϡʔఏڙ͞ΕΔ• σʔλϕʔε Datastore• σʔλੳ BigQuery• ଞʹଟͷػೳ͕͋Γɺ App Engine ͱ࿈ܞͰ͖ΔプロジェクトApp EngineApp EngineDatastoreInstancesSearchBigQueryTaskQueue- GCE- Logsetc.- Networks
ϓϩμΫτ։ൃϑΥʔΧε - GAE14• Ϟδϡʔϧͱόʔδϣϯ• ΞϓϦέʔγϣϯΛෳͷڥʹσϓϩΠͰ͖Δ = όʔδϣϯͱݺΕΔ• όʔδϣϯʹରͯ͠τϥϑΟοΫͷৼΓ͚ΛઃఆͰ͖Δ• ཧతͳ Blue / Green σϓϩΠग़యɿIUUQTDMPVEHPPHMFDPNTPMVUJPOTNJDSPTFSWJDFTPOBQQFOHJOF
ཧతͳ Blue/Green σϓϩΠ15
ϓϩμΫτ։ൃϑΥʔΧε - GAE16• ΠϯελϯεͷΦʔτεέʔϧ• App Engine ʹΞϓϦέʔγϣϯΛσϓϩΠ͢Δ͚ͩͰΦʔτεέʔϧ͢Δ• ΞΫηε͕ͳ͚ΕΠϯελϯε্ཱ͕ͪΒͣɺ ΞΫηε͕͋ͬͨͱ͖ʹ্ཱ͕ͪΔ• Πϯελϯε VM Ͱͳܰ͘ྔίϯςφ• Go ͷΠϯελϯεͳΒىಈ200msҎԼ• طଘΞϓϦ͔Βͷྲྀ͜͠ΈେنͳࠂϓϩϞʔγϣϯͰɺ Կ͠ͳͯ͘ॠ࣌ʹΠϯελϯε͕૿͑ͯॲཧ͞ΕΔ
GAE ͷΦʔτεέʔϧ17
౷߹͞Ε͍ͯΔϦΞϧλΠϜͷϩάػೳ18
౷߹͞Ε͍ͯΔϦΞϧλΠϜͷϩάػೳ - τϨʔε19
ࢄγεςϜͷͨΊͷ%BUBTUPSF
ӬଓԽσʔλΛͲ͏ͬͯεέʔϧͤ͞Δ͔21• Ҋ1) RDB ʹΑΔ౷తͳ Master/Slave Ϟσϧ• ࣮ेͰཱ֬͞Εͨख๏• ͱ͍͑ DB Λθϩ͔Β্ཱͪ͛ͯεέʔϧ͍ͤͯ͘͞ͷେม• େنͳσʔλʹͳΔ΄Ͳ RDB ຊདྷͷ࣋ͪຯੜ͔ͤͳ͘ͳΔ• ҟͳΔ DB ςʔϒϧͱͷτϥϯβΫγϣϯ͕Ͱ͖ͳ͍ɻJOIN ͕ݶఆత• Ϣʔβͷ্ݶ͕Θ͔͍ͬͯΔ߹͜ΕͰ OK• → GCP Ͱ Cloud SQL ͕ఏڙ͞Ε͍ͯΔ
ӬଓԽσʔλΛͲ͏ͬͯεέʔϧͤ͞Δ͔22• Ҋ2) εέʔϥϏϦςΟΛॏࢹͨ͠ NoSQL Ϟσϧ• NoSQL σʔλϕʔε "Datastore"• τϨʔυΦϑɿ• ࣮༻తͳ ACID ͖͋ΒΊΔ• ۃΊͯߴ͍εέʔϥϏϦςΟ
RDB ͱ NoSQL ͲͪΒΛબͿ͖͔ʁ23• ؒҧ͍ͳ͘ɺGAE ͷσʔλϕʔεʹ Datastore ΛબͿ͖• Gmail YouTube ͷΑ͏ͳαʔϏεͷσʔλ RDB Ͱͳ͘ BigTable ʹอଘ͞Ε͍ͯΔ• NoSQL ͷ࣮ Google ͕࣮ূࡁΈ• ΞοςͪΖΜ RDB ΛΘͣ Datastore Λར༻• ͍͜ͱ׳Ε͠ΜͰ͖ͨ RDB Ͱͳ͘ɺNoSQL ΛબͿܾஅ͍͠• ͔͠͠άϩʔόϧϨϕϧͷେنαʔϏεΛ࡞ΔͨΊʹ NoSQL ΛબͿܾஅΛ͠Α͏
Datastore ͷಛ24• ΦϒδΣΫτߏΛ࣋ͭεΩʔϚϨεͳ Key-Value Store ʹ ୯७ͳΫΤϦʹΑΔݕࡧΛՃ͑ͨͷ• BigTable ͷ্ʹߏங͞Ε͍ͯΔ• BigTable ୯७ͳ KVSʢΩʔΛݩʹͨ͠ߦ୯Ґͷ CRUD + Ωʔͷൣғݕࡧʣ
Datastore ͷಛ25• Pros• ۃΊͯߴ͍εέʔϥϏϦςΟ• ӬଓԽͰ͖ΔσʔλʢΤϯςΟςΟʣͷʹ੍ݶͳ͍• ӬଓԽσʔλ͕ͲΕ͚ͩ૿͑ͯऔಘͱՃͷྼԽ͠ͳ͍• 1݅Ͱ10ԯ݅Ͱಉ͡• ಉҰΤϯςΟςΟͰͳ͚Ε੍ݶͳ͠ͷฒྻॻ͖ࠐΈ• ۃΊͯߴ͍Մ༻ੑ• μϯλΠϜͳ͠• Cons• BigTable ΑΓߴػೳͱ͍͑ϓϦϛςΟϒ• ݶఆ͞Εͨ݅Ͱ͔͠ ACID τϥϯβΫγϣϯ͕αϙʔτ͞Εͳ͍• JOIN ͕ͳ͍ɺू͕ؔͳ͍ɺetc.
Datastore Λ͏ͱ͖ʹߟ͑Δ͜ͱ26• RDB ͷύλʔϯΛͦͷ··ͯΊΔ͜ͱͰ͖ͳ͍• ྫ1) τϥϯβΫγϣϯͳ͠ͰෳͷΛҰ؏ੑΛ࣋ͨͤͯߋ৽• → Ұ࣌తʹҰ؏ੑ͕ͳ͘ͳΔ͜ͱΛڐ༰͢Δ• ྫ2) ΦʔτΠϯΫϦϝϯτʢ୯ௐ૿Ճ͢Δͷ࠾൪ʣ• → Datastore ͷػೳ͚ͩͰεέʔϧ͢Δ࠾൪࣮Ͱ͖ͳ͍• ࢄγεςϜͰͷΦʔτΠϯΫϦϝϯτͷߟ͑ํ͕ඞཁ
8FCΞϓϦέʔγϣϯͷΞʔΩςΫνϟ
Web ΞϓϦέʔγϣϯͷΞʔΩςΫνϟ28• Go Ͱ Web ΞϓϦΛ࡞Δ͜ͱͰ͖Δʁ → Ͱ͖Δ• ͲΜͳϑϨʔϜϫʔΫΛ͏ʁ → net/http?• ੜ࢈ੑʁ → ʁʁʁΑ͘ฉ͔ΕΔ͜ͱ
ΞοςͷΞʔΩςΫνϟ29• ΞϓϦέʔγϣϯෳݸͷϞδϡʔϧͰߏ͞ΕΔ• APIɺWebɺCS toolɺetc.• Ϟδϡʔϧͦͷ··σϓϩΠ୯Ґ• ୯ҰͷϦϙδτϦ(monorepo)Ͱɺଟ͘ͷίʔυڞ௨• API JSON RPC 2.0• Web ͱ CS tool HTML Λಈతੜ͢Δ• ΞϓϦέʔγϣϯɺυϝΠϯɺUIɺΠϯϑϥͷ4ʹ͔Ε͍ͯͯɺ֤Ϟδϡʔϧ UI ͷҧ͍ͱͯ͠දݱ͍ͯ͠Δ
ΞοςͷΞϓϦέʔγϣϯͷઃܭํ30• GAE ͷґଘ• GAE ͷػೳΛϑϧʹ׆༻͢Δ͜ͱͰεέʔϥϏϦςΟՄ༻ੑͷԸܙΛड͚͍ͯΔ• વɺڧྗʹϩοΫΠϯ͞ΕΔ͜ͱʹͳΔ• ͔͞͞ͳ߅ɿυϝΠϯʢϏδωεϩδοΫʣͱΠϯϑϥΛ͚ͯɺυϝΠϯΛ GAE ʹґଘ͠ͳ͍Α͏ʹ͍ͯ͠Δ• Datastore Λར༻͢Δ Repository Λ AWS ͷ DynamoDB Λར༻͢ΔRepository ʹࠩ͠ସ͑Α͏ͱࢥ͑Ͱ͖Δ
ΞοςͷΞϓϦέʔγϣϯͷઃܭํ31• Go ͷߟ͑ํʹै͏• ίʔυͷॻ͖ํͷΑ͏ͳࡉ͔͍͜ͱ• ύοέʔδΛͲ͏ཧ͢Δ͔• ॏްͳϑϨʔϜϫʔΫΛಋೖ͠ͳ͍• x/net/context ͱ net/http ύοέʔδ• 1ͭͷϦϙδτϦʹͯ͢ΛೖΕΔʢmonorepoʣ• APIɺWebɺCStool ͷΑ͏ͳڥք͕ҟͳΓͦ͏ͳϓϩδΣΫτΛɺ୯ҰϓϩδΣΫτͱͯ͠ѻ͏• ڞ௨෦Λѻ͍͘͢ͳͬͯɺґଘؔཧ؆୯ʹͳΔ• ԣஅతͳίʔυͷվमΛ͘͢͠ͳΔ
·ͱΊ321. Go ͱ GAE ඇৗʹ༗ྗͳ Web ΞϓϦ։ൃखஈ2. PaaS ͷ͕࣌ຊ֨తʹ࢝·͖ͬͯͨ → ͥͻ GAE/Go Λମݧͯ͠Έ͍ͯͩ͘͞