Apr 25, 2017 / Speee Cafe Meetup #06
の資料です。
HARD THINGSin Ad-Tech EngineeringApr 25, 2017 /Speee Cafe Meetup #06@jsoizo
View Slide
whoami• ໊લ : @jsoizo / Jun Sakamoto• ݴޠ : JavaScriptͱScalaΛগʑ• ॴଐ :• ׂ : ৽نΞυϓϩμΫτͷProduct Manager• “Project” Manager͔ΒͷసνϟϨϯδத• લ৬͔Β͑ͯΞυςΫྺ6
࣭ΞυςΫܦݧऀͷํ?ೖ/ඇܦݧऀͷํ?
ຊͷ͓
ΞυςΫΤϯδχΞత࠷HARDͳTHINGSͱ?
৴ো
γεςϜͱͯ͠ɺ৫ͱͯ͠ͲͷΑ͏ʹཱ͔͔ͪͬͨ
ΞυςΫͱো• ࠂ৴γεςϜɺओʹҎԼͷཁ݅Λຬͨ͢ඞཁ͕͋Δ• ࠂओ͔Β༬͔ͬͨ༧ࢉΛ࠷దʹ͏• ৴ઌͷϝσΟΞʹରͯ͠ϢʔβମݧΛམͱͣ͞ऩӹΛग़͢• Ϣʔβ͕ྑ͍ίϯςϯπ(≒ࠂओ)ʹग़ձ͑Δ• γεςϜ͕ɺ• ਖ਼͘͠ಈ͍͍ͯΕશһ͕ϋοϐʔ • ো͕͋Δͱશһ͕ͭΒ͍
ϋΠύϑΥʔϚϯε͔ͭԿ͕͋ͬͯࢮͳͳ͍(≒Կ͔͋ͬͯܰ)γεςϜߏஙͷඞཁੑ
γεςϜશମ૾
࣮ࡍʹ͋ͬͨ͜ͱ͋Δౙͷͷனɺϥϯνʹߦ͜͏ͱͨ͠ॠؒɺλʔήςΟϯάࠂ৴ͷফԽֹۚΛཧ͍ͯͨ͠KVSΫϥελ͕※ ϊʔυͰͳ͘ɺΫϥελͰ͢ʊਓਓਓਓਓਓʊʼɹಥવͷࢮɹʻʉY^Y^Y^Y^Yʉ
࣮ࡍʹ͋ͬͨ͜ͱͦͷʹ͍ͨશһͰϊʔυͷ࠶ىಈΛ܁Γฦͭͭ͠ɺཪͰΠϯϑϥΤϯδχΞ͕ௐࠪىಈͯ͠ىಈͯ͠ଈࢮ͢ΔΫϥελ݁ہ࣌τϥϑΟοΫͷຆͲΛΊ͍ͯͨαΠτɹ͔ΒλάΛണ͕ͯ͠Β͍ఆରԠ→ xxͿΜͷച্͕·Δ·Δਧ͖ඈΜͩ
࠶ൃࢭͷͨΊʹͨ͜͠ͱ1. EBS(Elastic Block Store)2. KVSΫϥελͷґଘΛ(෦తʹ)ΊΔ3.͋ΒΏΔI/OΛۃྗඇಉظʹ͢Δ4. ৴αʔό͕མͪͨ߹ʹnginx, λά͕र͏5. ͋ΒΏΔࢹ, ϩάམͱ͠ΛՃ
1. EBS(Elastic Block Store)2. KVSΫϥελͷґଘΛ(෦తʹ)ΊΔ3.͋ΒΏΔI/OΛۃྗඇಉظʹ͢Δ4. ৴αʔό͕མͪͨ߹ʹnginx, λά͕र͏5. ͋ΒΏΔࢹ, ϩάམͱ͠ΛՃ࠶ൃࢭͷͨΊʹͨ͜͠ͱ
1. EBS
1. EBSSSDͷRead/WriteಛԽͨ͠KVSΛར༻͍ͯ͠Δ͕ɺ༷ͱͯ͠• ϑΝΠϧγεςϜܦ༝Ͱͳ͘SSDʹॻ͖ࠐΉ• ֤ϊʔυͷϝϞϦ্ʹΠϯσοΫε(=KeyʹରԠͨ͠Value͕ͲͷϊʔυͷͲͷσΟεΫͷͲ͜ʹॻ͔Ε͍ͯΔ͔ͷΞυϨεใ)Λ࣋ͭ• ΫϥελϚωδϝϯτͷػೳඋ͍͑ͯΔͷͰཧָ• ͨͩ͠ɺ֤ϊʔυʹରͯ͠heartbeatࢮ׆ࢹ͢Δ͕ɺ֤ϊʔυ͕͍ͯ͠ΔσΟεΫʹରͯ͠(΄΅)Կ͠ͳ͍
1. EBSEBS = Elastic Block Store• EC2ʹϚϯτՄ• ߴ͍Մ༻ੑͱٱੑ• ωοτϫʔΫܦ༝ͰI/O• ෦తʹԽ͞Ε͍ͯΔ• EC2ىಈ࣌ʹEBS࠷దԽΦϓγϣϯΛཧతʹೖΕͳ͍ͱΠϯελϯεͱEBS͕ཧతʹΕΔো࣌ʹEBSͷσΟεΫނোͰEBS͕ϑΣΠϧΦʔόʔதʹؒͬͯ͠·ͬͨ
1. EBSΠϯελϯεετΞ(=ΤϑΣϝϥϧσΟεΫ)ʹม͑ͨɻ• Pros• Πϯελϯε͠ͷͨΊͱʹ͔͍͘• εϧʔϓοτ͕མͪΔཁҼ͕গͳ͍• Cons• Πϯελϯε࠶ىಈͰشൃ• αΠζ্ݶ͋Γ• Մ༻ੑ͍
2. KVSΫϥελґଘΛΊΔ
2. KVSΫϥελґଘΛΊΔ• 1ͭͷKVSΫϥελ• SSDʹอଘ(memcached, redisͱͷҧ͍)• ͕ɺϝϞϦʹอଘ͢ΔϓϩμΫτ૬Ԡʹ͍• ్ओʹҎԼͷ3ͭ• ৴αʔόͷ෦ΦʔΫγϣϯ༻༧ࢉཧ• ଐੑλʔήςΟϯά x3 छྨ• ϦλʔήςΟϯά
2. KVSΫϥελґଘΛΊΔ (1)৴αʔόͷΦʔΫγϣϯͰͷࢀরΛվળͯ͠KVSͷར༻ྔΛݮΒͨ͠• چ• ෦ೖࡳͷΦʔΫγϣϯຖʹඞͣফԽֹۚΛࢀরͯ͠༧ࢉͱಥ߹• ͜ͷ߹ɺKVS͕ࢮ͵ͱԿग़དྷͳ͘ͳΔ• ৽• ৴αʔό͕RDBMSʹ͍࣋ͬͯΔ݁Ռ͔Βܭࢉͨ͠ফԽֹۚΛఆظతʹΩϟογϡ• ༧ࢉ͕ਚ͖ͦ͏ʹͳΔલ·ͰKVSΛࢀর͠ͳ͍Α͏ʹ͢Δ• KVS͕ࢮΜͰ΄ͱΜͲͷ߹ࠂ͕ฦͤΔ
2. KVSΫϥελґଘΛΊΔ (2)• αʔϏεͱͯ͠ఏڙ͍ͯ͠ΔλʔήςΟϯάख๏ओʹҎԼ2ͭ• ଐੑλʔήςΟϯά x3छ• ϦλʔήςΟϯά• ଐੑλʔήͷ΄͏͕ѹతʹྔଟ͍(10:1͘Β͍, ച্5:1͘Β͍)• ݹ͍ߏͰ6000ສUUʹؔ͢ΔܭࢉΛόονͰߦ͍KVSʹॻ͘• ࠷ظ8࣌ؒ͘Β͍͔͔ͬͯ͠·͍ͬͯͨ• ͣͬͱෛՙࢼݧ͠ͳ͕Β৴͍ͯ͠ΔΑ͏ͳͷ
2. KVSΫϥελґଘΛΊΔ (2)ଐੑλʔήςΟϯάʹؔ͠ຊʹඞཁͩͬͨͷɺ୯ʹϢʔβIDΛΩʔͱͯ͠ɺଐ͢ΔηάϝϯτΛฦͯ͘͠ΕΔγϯϓϧͳػೳͷΈɻߴػೳͳDBΫϥελΛ͏ͷएׯToo Muchɻ→ ຊʹඞཁͳػೳ͚ͩΛ࣋ͬͨϚΠΫϩαʔϏε(Play2)Λ࡞ͬͯϦϓϨΠεͨ͠
2. KVSΫϥελґଘΛΊΔ (2)• چߏਤ
2. KVSΫϥελґଘΛΊΔ (2)• ৽ߏਤ
2. KVSΫϥελґଘΛΊΔ (2)چߏ ৽ߏλʔήςΟϯάͷΈ֎෦σʔλΛݩʹͨ͠όονͷܭࢉ݁ՌΛ,74ʹอଘSFRຖʹϦΞϧλΠϜܭࢉҰ෦ چߏ҆ఆੑσΟεΫຊ͕શମʹӨڹٴ΅͢ՄೳੑࢮΜͰӨڹͳ͠,74͕ࢮΜͰӨڹϨΠςϯγ dNTFD NTFDηάϝϯςʔγϣϯॲཧࠐΈίετSYMBSHFଞͷతؚΉDYMBSHFSYMBSHF
2. KVSΫϥελґଘΛΊΔ (2)ϦΞϧλΠϜηάϝϯςʔγϣϯͷͳ͔Έ• ࣄલʹόοναʔόͰଐੑσʔλΛRocksDBͱͯ͠ݻΊΔ• RocksDBΛWebαʔό͕ಡΈࠐΉ• httpϦΫΤετຖʹRocksDB͔ΒϢʔβଐੑΛಡΈࠐΜͰηάϝϯςʔγϣϯͯ͠ฦ٫
2. KVSΫϥελґଘΛΊΔ (2)ͳͥRocksDB͔?• RocksDB : FacebookͷMySQLΤϯδϯ(MyRocks)ࠓ͖ParseͷmongodbͷόοΫΤϯυͰར༻͞Ε͍ͯΔSSDͷWriteʹ࠷దԽ͞ΕͨΈࠐΈ༻DB࣮ɻLevelDBͷforkɻ• ΈࠐΈͰ, ߴʹ, େྔͳσʔλ͔ΒҾ͘ΈΛٻΊͯ• ಉ༷ʹݕ౼ͨ͠h2dbͱͷൺֱͰɺएׯύϑΥʔϚϯε͕ྑ͔ͬͨ͜ͱɺσʔλͷswap(ଐੑσʔλͷ࣍Ξοϓσʔτ)࣌ͷύϑΥʔϚϯεྼԽ߹͍͕͔ͬͨ͜ͱ͔Βஅ
2. KVSΫϥελґଘΛΊΔ (2)h2dbͱͷൺֱͰएׯɺRocksDBͷ΄͏͕ૣ͘ɺϦιʔεফඅ͕গͳ͔ͬͨ
͜͜·Ͱͷ·ͱΊμϯ͠ͳ͍ɺμϯλΠϜΛۃྗগͳ͘͢ΔͨΊʹͲ͏͢Δ͔?• ΠϯϑϥɺϛυϧɺΞϓϦέʔγϣϯશͯγϯϓϧͳߏʹ• ͨ·ʹϨΠςϯγΛଟগ٘ਜ਼ʹͯ͠Ͱ҆ఆੑΛऔΔ• I/Oग़དྷΔݶΓඇಉظʹͯ͠ෛͷ࿈Λ͙• EBSϋΠύϑΥʔϚϯεڥͰආ͚Δ• શͯΛτϨʔεग़དྷΔΈΛ͑Δ• ͍͟ͱ͍͏࣌ʹϢʔβ͚ͩʹ໎Λ͔͚ͳ͍Α͏ʹ͢Δ
ͦΕ͚ͩͰOK???
No.όάʹΑΔোΛ͍͔ʹ͙ͯ͠ͷ͔?
ཧ্ྲྀͰ͍͗ͨҰํͰ…
ΤϯδχΞۀͷࣄऀͰͳ͍ͨΊʹཁ݅Λਖ਼֬ʹཧղ͍͠͠
ۀࣝෆΤϯδχΞͷۀࣝෆΛͲ͏ิ͏͔?• جຊతʹΤϯδχΞؤு֮ͬͯ͑Α͏ελϯε• DDD(Domain Driven Design)ΛΔͱ͍͏લఏ• ॳظͷۀࣝͷֶशίετͷߴ͕͞ωοΫʹͳΔ߹• PM(ProductManager)ͷ༁ೳྗ, ۀઃܭྗʹৼΔ• αϘΒͣʹ༷ॻΛॻ͘ମ੍
ߴ͍༁ೳྗΛ࣋ͭPMFringe81Ͱݩʑ3PASΞφϦετͩͬͨϝϯόʔ͕PMΛΔ• ݩʑઆ໌ೳྗ͕ߴ͍ͱ͜Ζʹ• ඇΤϯδχΞ͕ͩߴ͍ٕज़ཧղྗΛ͍࣋ͬͯΔ• ͚ࣾϨϙʔτఔͳΒউखʹSQLୟ͍ͯ࡞ΕΔ݁ՌɺΤϯδχΞ• ػೳཁ݅ͷೝࣝζϨɺඇػೳཁ݅ͷݕ౼࿙Ε͕ݮΔ• ຊ࣭తͳ(ઃܭύϑΥʔϚϯεվળ)ʹूதͰ͖Δ
αϘΒͣʹ༷ॻΛॻ͘ମ੍ϕϯνϟʔͰ͘͠?͔ͳΓ༷ॻΛॻ͘จԽ(AdνʔϜಛʹ)ɻݹయతͳΓํΛ࣮֬ʹண࣮ʹ͜ͳ্͠ྲྀͷΛݮΒ͢ɻΞδϟΠϧͰجຊతʹΔ͜ͱҰॹɻ※ શͯͷ༷ॻtextlintΛCIͰ࣮ߦͯ͠ʹΛυϝΠϯ༻ޠͷϒϨΛݕࠪ→ ݁ՌISO 9001(࣭ϚωδϝϯτγεςϜ)Λऔಘͨ͠
৽͍͠νϟϨϯδ• QAνʔϜͷઃஔ : ͞ΒͳΔ࣭ͷ্• ઃܭ/ςετͷϨϏϡʔͱ୳ࡧతςετͷ࣮ࢪ• ΤϯδχΞ͔ΒPM : ࣄۀܥPMͷґଘΛԼ͛Δ• ओʹ৽نࣄۀํ໘Ͱൈṅ• ఆظతͳϙδγϣϯνΣϯδ : εΩϧτϥϯεϑΝʔ• ׂݻఆ͢ΔͱಛఆྖҬͷٕज़/ۀ͔͔ࣝͭ͠ͳ͍ͷΛ͙• ۙͰཧը໘ϝϯόʔͱ৴αʔόϝϯόʔΛεϫοϓ
·ͱΊHARD THINGS = োʹର͠ɺٕज़ͱ৫ͷ2໘͔Βཱ͔ͪͬͨ• ٕज़• γϯϓϧ͔ͭFail͕͠ͳ͍ઃܭ• λʔήςΟϯάج൫ΛKVSΫϥελ͔ΒWebAppʹ• ৫• ۀࣝ + ٕज़ͷཧղྗߴ͍PMͱͷڠௐ• ݹయతͳΓํΛ࣮֬ʹண࣮ʹΔେਓελΠϧ• QAνʔϜ, ΤϯδχΞൃPMͷ৽͍͠৫ମ੍Ͱຏ͘
ँࣙোൃੜ࣌ʹࣾ֎ͷରԠΛ͍͍ͯͨͩͨ͠ProductνʔϜɺมΘΒͣӦۀΛଓ͚͍͍ͯͨͩͨSalesνʔϜ͕͋ͬͯͦ͜ɺোΛΓΔ͜ͱ͕ग़དྷ·ͨ͠ɻ·ͨɺࠒΑΓࢁͷϑΟʔυόοΫΛ͍͍͍ͯͨͩͯ͠Δ͓͔͛Ͱɺ৫Λม͑ΔΞΫγϣϯ͕औΕ͍ͯΔ͜ͱΛײँ͓ͯ͠Γ·͢ɻ͋Γ͕ͱ͏͍͟͝·͢ɻ
THANK YOU—Fringe81Ͱɺ৽͍͠ൃݟΛݩʹٿͷະདྷΛΒΜͱ͢ΔΤϯδχΞΛืूதͰ͢ɻ͋ͳͨͷಘҙͳ͜ͱͰҰॹʹউෛ͠·ͤΜ͔ɻhttp://www.fringe81.com/recruit/