Slide 1

Slide 1 text

HARD THINGS in Ad-Tech Engineering Apr 25, 2017 / Speee Cafe Meetup #06 @jsoizo 

Slide 2

Slide 2 text

whoami • ໊લ : @jsoizo / Jun Sakamoto • ݴޠ : JavaScriptͱScalaΛগʑ • ॴଐ : • ໾ׂ : ৽نΞυϓϩμΫτͷProduct Manager • “Project” Manager͔Βͷస਎νϟϨϯδத • લ৬͔Β਺͑ͯΞυςΫྺ6೥໨ 

Slide 3

Slide 3 text

࣭໰ ΞυςΫܦݧऀͷํ? ೖ໳/ඇܦݧऀͷํ? 

Slide 4

Slide 4 text

ຊ೔ͷ͓୊ 

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

ΞυςΫΤϯδχΞత ࠷΋HARDͳTHINGSͱ͸? 

Slide 7

Slide 7 text

഑৴ো֐ 

Slide 8

Slide 8 text

γεςϜͱͯ͠ɺ૊৫ͱͯ͠ ͲͷΑ͏ʹཱͪ޲͔͔ͬͨ 

Slide 9

Slide 9 text

ΞυςΫͱো֐ • ޿ࠂ഑৴γεςϜ͸ɺओʹҎԼͷཁ݅Λຬͨ͢ඞཁ͕͋Δ • ޿ࠂओ͔Β༬͔ͬͨ༧ࢉΛ࠷దʹ࢖͏ • ഑৴ઌͷϝσΟΞʹରͯ͠ϢʔβମݧΛམͱͣ͞ऩӹΛग़͢ • Ϣʔβ͕ྑ͍ίϯςϯπ(≒޿ࠂओ)ʹग़ձ͑Δ • γεςϜ͕ɺ • ਖ਼͘͠ಈ͍͍ͯΕ͹શһ͕ϋοϐʔ • ো֐͕͋Δͱશһ͕ͭΒ͍ 

Slide 10

Slide 10 text

ϋΠύϑΥʔϚϯε͔ͭ Կ͕͋ͬͯ΋ࢮͳͳ͍ (≒Կ͔͋ͬͯ΋ܰ঱) γεςϜߏஙͷඞཁੑ 

Slide 11

Slide 11 text

γεςϜશମ૾ 

Slide 12

Slide 12 text

γεςϜશମ૾ 

Slide 13

Slide 13 text

γεςϜશମ૾ 

Slide 14

Slide 14 text

࣮ࡍʹ͋ͬͨ͜ͱ ͋Δౙͷ೔ͷனɺϥϯνʹߦ͜͏ͱͨ͠ॠؒɺ λʔήςΟϯά΍޿ࠂ഑৴ͷফԽֹۚ౳Λ ؅ཧ͍ͯͨ͠KVSΫϥελ͕ ※ ϊʔυͰ͸ͳ͘ɺΫϥελͰ͢ ʊਓਓਓਓਓਓʊ ʼɹಥવͷࢮɹʻ ʉY^Y^Y^Y^Yʉ 

Slide 15

Slide 15 text

࣮ࡍʹ͋ͬͨ͜ͱ ͦͷ৔ʹ͍ͨશһͰϊʔυͷ࠶ىಈΛ܁Γฦͭͭ͠ɺ ཪͰΠϯϑϥΤϯδχΞ͕ௐࠪ ىಈͯ͠΋ىಈͯ͠΋ଈࢮ͢ΔΫϥελ ݁ہ͸౰࣌τϥϑΟοΫͷຆͲΛ઎Ί͍ͯͨαΠτɹ ͔ΒλάΛണ͕ͯ͠΋Β͍࢑ఆରԠ → xx೔ͿΜͷച্͕·Δ·Δਧ͖ඈΜͩ 

Slide 16

Slide 16 text

࠶ൃ๷ࢭͷͨΊʹͨ͜͠ͱ 1. ୤EBS(Elastic Block Store) 2. KVSΫϥελ΁ͷґଘΛ(෦෼తʹ)΍ΊΔ 3.͋ΒΏΔI/OΛۃྗඇಉظʹ͢Δ 4. ഑৴αʔό͕མͪͨ৔߹ʹnginx, λά͕र͏ 5. ͋ΒΏΔ؂ࢹ, ϩάམͱ͠Λ௥Ճ 

Slide 17

Slide 17 text

1. ୤EBS(Elastic Block Store) 2. KVSΫϥελ΁ͷґଘΛ(෦෼తʹ)΍ΊΔ 3.͋ΒΏΔI/OΛۃྗඇಉظʹ͢Δ 4. ഑৴αʔό͕མͪͨ৔߹ʹnginx, λά͕र͏ 5. ͋ΒΏΔ؂ࢹ, ϩάམͱ͠Λ௥Ճ ࠶ൃ๷ࢭͷͨΊʹͨ͜͠ͱ 

Slide 18

Slide 18 text

1. ୤EBS 

Slide 19

Slide 19 text

1. ୤EBS SSD΁ͷRead/WriteಛԽͨ͠KVSΛར༻͍ͯ͠Δ͕ɺ࢓༷ͱͯ͠ • ϑΝΠϧγεςϜܦ༝Ͱ͸ͳ͘௚઀SSDʹॻ͖ࠐΉ • ֤ϊʔυͷϝϞϦ্ʹΠϯσοΫε(=KeyʹରԠͨ͠Value͕Ͳͷϊʔ υͷͲͷσΟεΫͷͲ͜ʹॻ͔Ε͍ͯΔ͔ͷΞυϨε৘ใ)Λ࣋ͭ • ΫϥελϚωδϝϯτͷػೳ΋උ͍͑ͯΔͷͰ؅ཧָ • ͨͩ͠ɺ֤ϊʔυʹରͯ͠͸heartbeatࢮ׆؂ࢹ͢Δ͕ɺ֤ϊʔυ͕ࢗ ͍ͯ͠ΔσΟεΫʹରͯ͠͸(΄΅)Կ΋͠ͳ͍ 

Slide 20

Slide 20 text

1. ୤EBS EBS = Elastic Block Store • EC2ʹϚ΢ϯτՄ • ߴ͍Մ༻ੑͱ଱ٱੑ • ωοτϫʔΫܦ༝ͰI/O • ಺෦తʹ͸৑௕Խ͞Ε͍ͯΔ • EC2ىಈ࣌ʹEBS࠷దԽΦϓγϣϯΛ෺ཧతʹೖΕͳ͍ͱΠϯελϯεͱEBS͕ ෺ཧతʹ཭ΕΔ ো֐࣌ʹ͸EBSͷσΟεΫނোͰEBS͕ϑΣΠϧΦʔόʔதʹ਺෼ؒ໧ͬͯ͠·ͬͨ 

Slide 21

Slide 21 text

1. ୤EBS ΠϯελϯεετΞ(=ΤϑΣϝϥϧσΟεΫ)ʹม͑ͨɻ • Pros • Πϯελϯε௚ࢗ͠ͷͨΊͱʹ͔͘଎͍ • εϧʔϓοτ͕མͪΔཁҼ͕গͳ͍ • Cons • Πϯελϯε࠶ىಈͰشൃ • αΠζ্ݶ͋Γ • Մ༻ੑ௿͍ 

Slide 22

Slide 22 text

2. KVSΫϥελґଘΛ΍ΊΔ 

Slide 23

Slide 23 text

2. KVSΫϥελґଘΛ΍ΊΔ 

Slide 24

Slide 24 text

2. KVSΫϥελґଘΛ΍ΊΔ  • 1ͭͷKVSΫϥελ • SSDʹอଘ(memcached, redis౳ͱͷҧ͍) • ͕ɺϝϞϦʹอଘ͢ΔϓϩμΫτ૬Ԡʹ଎͍ • ࢖్͸ओʹҎԼͷ3ͭ • ഑৴αʔόͷ಺෦ΦʔΫγϣϯ༻༧ࢉ؅ཧ • ଐੑλʔήςΟϯά x3 छྨ • ϦλʔήςΟϯά

Slide 25

Slide 25 text

2. KVSΫϥελґଘΛ΍ΊΔ (1) ഑৴αʔόͷΦʔΫγϣϯͰͷࢀরΛվળͯ͠KVSͷར༻ྔΛݮΒͨ͠ • چ • ಺෦ೖࡳͷΦʔΫγϣϯຖʹඞͣফԽֹۚΛࢀরͯ͠༧ࢉͱಥ߹ • ͜ͷ৔߹ɺKVS͕ࢮ͵ͱԿ΋ग़དྷͳ͘ͳΔ • ৽ • ഑৴αʔό͕RDBMSʹ͍࣋ͬͯΔ݁Ռ͔Βܭࢉͨ͠ফԽֹۚΛఆظ తʹΩϟογϡ • ༧ࢉ͕ਚ͖ͦ͏ʹͳΔ௚લ·ͰKVSΛࢀর͠ͳ͍Α͏ʹ͢Δ • KVS͕ࢮΜͰ΋΄ͱΜͲͷ৔߹޿ࠂ͕ฦͤΔ 

Slide 26

Slide 26 text

2. KVSΫϥελґଘΛ΍ΊΔ (2) • αʔϏεͱͯ͠ఏڙ͍ͯ͠ΔλʔήςΟϯάख๏͸ओʹҎԼ2ͭ • ଐੑλʔήςΟϯά x3छ • ϦλʔήςΟϯά • ଐੑλʔήͷ΄͏͕ѹ౗తʹྔ͸ଟ͍(10:1͘Β͍, ച্͸5:1͘Β͍) • ݹ͍ߏ੒Ͱ͸6000ສUUʹؔ͢ΔܭࢉΛόονͰߦ͍KVSʹॻ͘ • ࠷੝ظ͸8࣌ؒ͘Β͍͔͔ͬͯ͠·͍ͬͯͨ • ͣͬͱෛՙࢼݧ͠ͳ͕Β഑৴͍ͯ͠ΔΑ͏ͳ΋ͷ 

Slide 27

Slide 27 text

2. KVSΫϥελґଘΛ΍ΊΔ (2) ଐੑλʔήςΟϯάʹؔ͠ ຊ౰ʹඞཁͩͬͨ΋ͷ͸ɺ୯ʹϢʔβIDΛΩʔͱͯ͠ɺଐ ͢ΔηάϝϯτΛฦͯ͘͠ΕΔγϯϓϧͳػೳͷΈɻߴػೳ ͳDBΫϥελΛ࢖͏ͷ͸एׯToo Muchɻ → ຊ౰ʹඞཁͳػೳ͚ͩΛ࣋ͬͨ ϚΠΫϩαʔϏε(Play2)Λ࡞ͬͯϦϓϨΠεͨ͠ 

Slide 28

Slide 28 text

2. KVSΫϥελґଘΛ΍ΊΔ (2) • چߏ੒ਤ 

Slide 29

Slide 29 text

2. KVSΫϥελґଘΛ΍ΊΔ (2) • ৽ߏ੒ਤ 

Slide 30

Slide 30 text

2. KVSΫϥελґଘΛ΍ΊΔ (2)  چߏ੒ ৽ߏ੒ λʔήςΟϯά ͷ࢓૊Έ ֎෦σʔλΛݩʹͨ͠ όονͷܭࢉ݁ՌΛ ,74ʹอଘ SFRຖʹϦΞϧλΠϜܭࢉ Ұ෦  ͸چߏ੒ ҆ఆੑ σΟεΫຊ͕શମʹ Өڹٴ΅͢Մೳੑ ୆ࢮΜͰ΋Өڹͳ͠ ,74͕ࢮΜͰ΋Өڹ ϨΠςϯγ dNTFD  NTFD ηάϝϯςʔγϣϯॲཧࠐΈ ίετ SYMBSHF୆ ଞͷ໨తؚΉ DYMBSHF୆ SYMBSHF୆

Slide 31

Slide 31 text

2. KVSΫϥελґଘΛ΍ΊΔ (2)  ϦΞϧλΠϜηάϝϯςʔγϣϯͷͳ͔Έ • ࣄલʹόοναʔόͰଐੑσʔλΛRocksDBͱͯ͠ ݻΊΔ • RocksDBΛWebαʔό͕ಡΈࠐΉ • httpϦΫΤετຖʹRocksDB͔ΒϢʔβଐੑΛಡΈ ࠐΜͰηάϝϯςʔγϣϯͯ͠ฦ٫

Slide 32

Slide 32 text

2. KVSΫϥελґଘΛ΍ΊΔ (2) ͳͥRocksDB͔? • RocksDB : FacebookͷMySQLΤϯδϯ(MyRocks)΍ࠓ͸๢͖Parse ͷmongodbͷόοΫΤϯυͰར༻͞Ε͍ͯΔSSD΁ͷWriteʹ࠷ద Խ͞Εͨ૊ΈࠐΈ༻DB࣮૷ɻLevelDBͷforkɻ • ૊ΈࠐΈͰ, ߴ଎ʹ, େྔͳσʔλ͔ΒҾ͘࢓૊ΈΛٻΊͯ • ಉ༷ʹݕ౼ͨ͠h2dbͱͷൺֱͰɺएׯύϑΥʔϚϯε͕ྑ͔ͬͨ͜ ͱɺσʔλͷswap(ଐੑσʔλͷ೔࣍Ξοϓσʔτ)࣌ͷύϑΥʔϚ ϯεྼԽ౓߹͍͕௿͔ͬͨ͜ͱ͔Β൑அ 

Slide 33

Slide 33 text

2. KVSΫϥελґଘΛ΍ΊΔ (2)  h2dbͱͷൺֱͰ एׯɺRocksDBͷ΄͏͕ૣ͘ɺϦιʔεফඅ͕গͳ͔ͬͨ

Slide 34

Slide 34 text

͜͜·Ͱͷ·ͱΊ μ΢ϯ͠ͳ͍ɺμ΢ϯλΠϜΛۃྗগͳ͘͢ΔͨΊʹͲ͏͢Δ͔? • ΠϯϑϥɺϛυϧɺΞϓϦέʔγϣϯશͯγϯϓϧͳߏ੒ʹ • ͨ·ʹϨΠςϯγΛଟগ٘ਜ਼ʹͯ͠Ͱ΋҆ఆੑΛऔΔ • I/O͸ग़དྷΔݶΓඇಉظʹͯ͠ෛͷ࿈࠯Λ๷͙ • EBS͸ϋΠύϑΥʔϚϯε؀ڥͰ͸ආ͚Δ • શͯΛτϨʔεग़དྷΔ࢓૊ΈΛ੔͑Δ • ͍͟ͱ͍͏࣌ʹϢʔβ͚ͩʹ͸໎࿭Λ͔͚ͳ͍Α͏ʹ͢Δ 

Slide 35

Slide 35 text

ͦΕ͚ͩͰOK??? 

Slide 36

Slide 36 text

No. όάʹΑΔো֐Λ ͍͔ʹͯ͠๷͙ͷ͔? 

Slide 37

Slide 37 text

ཧ૝͸্ྲྀͰ๷͍͗ͨ ҰํͰ… 

Slide 38

Slide 38 text

ΤϯδχΞ͸ۀ຿ͷ ౰ࣄऀͰͳ͍ͨΊʹ ཁ݅Λਖ਼֬ʹཧղ͠೉͍͠ 

Slide 39

Slide 39 text

ۀ຿஌ࣝෆ଍໰୊ ΤϯδχΞͷۀ຿஌ࣝෆ଍ΛͲ͏ิ͏͔? • جຊతʹ͸ΤϯδχΞ΋ؤு֮ͬͯ͑Α͏ελϯε • DDD(Domain Driven Design)Λ΍Δͱ͍͏લఏ • ॳظͷۀ຿஌ࣝͷֶशίετͷߴ͕͞ωοΫʹͳΔ৔߹΋ • PM(ProductManager)ͷ຋༁ೳྗ, ۀ຿ઃܭྗʹৼΔ • αϘΒͣʹ࢓༷ॻΛॻ͘ମ੍ 

Slide 40

Slide 40 text

ߴ͍຋༁ೳྗΛ࣋ͭPM Fringe81Ͱ͸ݩʑ3PASΞφϦετͩͬͨϝϯόʔ͕PMΛ΍Δ • ݩʑઆ໌ೳྗ͕ߴ͍ͱ͜Ζʹ • ඇΤϯδχΞ͕ͩߴ͍ٕज़ཧղྗΛ͍࣋ͬͯΔ • ࣾ಺޲͚Ϩϙʔτఔ౓ͳΒউखʹSQLୟ͍ͯ࡞ΕΔ ݁ՌɺΤϯδχΞ͸ • ػೳཁ݅ͷೝࣝζϨɺඇػೳཁ݅ͷݕ౼࿙Ε͕ݮΔ • ຊ࣭తͳ໰୊(ઃܭ΍ύϑΥʔϚϯεվળ)ʹूதͰ͖Δ 

Slide 41

Slide 41 text

αϘΒͣʹ࢓༷ॻΛॻ͘ମ੍ ϕϯνϟʔͰ͸௝͘͠? ͔ͳΓ࢓༷ॻΛॻ͘จԽ(AdνʔϜ͸ಛʹ)ɻ ݹయతͳ΍ΓํΛ࣮֬ʹண࣮ʹ͜ͳ্͠ྲྀͷ ໰୊ΛݮΒ͢ɻΞδϟΠϧͰ΋جຊతʹ΍Δ ͜ͱ͸Ұॹɻ ※ શͯͷ࢓༷ॻ͸textlintΛCIͰ࣮ߦͯ͠ʹΛ ͸΍υϝΠϯ༻ޠͷϒϨΛݕࠪ  → ݁ՌISO 9001(඼࣭ϚωδϝϯτγεςϜ)Λऔಘͨ͠

Slide 42

Slide 42 text

৽͍͠νϟϨϯδ • QAνʔϜͷઃஔ : ͞ΒͳΔ඼࣭ͷ޲্ • ઃܭ/ςετͷϨϏϡʔͱ୳ࡧతςετͷ࣮ࢪ • ΤϯδχΞ͔ΒPM΁ : ࣄۀܥPM΁ͷґଘ౓ΛԼ͛Δ • ओʹ৽نࣄۀํ໘Ͱൈṅ • ఆظతͳϙδγϣϯνΣϯδ : εΩϧτϥϯεϑΝʔ • ໾ׂݻఆ͢ΔͱಛఆྖҬͷٕज़/ۀ຿஌͔͔ࣝͭ͠ͳ͍ͷΛ๷͙ • ௚ۙͰ͸؅ཧը໘ϝϯόʔͱ഑৴αʔόϝϯόʔΛεϫοϓ 

Slide 43

Slide 43 text

·ͱΊ HARD THINGS = ো֐ʹର͠ɺٕज़ͱ૊৫ͷ2໘͔Βཱͪ޲͔ͬͨ • ٕज़ • γϯϓϧ͔ͭFail͕఻೻͠ͳ͍ઃܭ • λʔήςΟϯάج൫ΛKVSΫϥελ͔ΒWebAppʹ • ૊৫ • ۀ຿஌ࣝ + ٕज़΁ͷཧղྗߴ͍PMͱͷڠௐ • ݹయతͳ΍ΓํΛ࣮֬ʹண࣮ʹ΍ΔେਓελΠϧ • QAνʔϜ, ΤϯδχΞൃPM౳ͷ৽͍͠૊৫ମ੍Ͱຏ͘ 

Slide 44

Slide 44 text

ँࣙ ো֐ൃੜ࣌ʹࣾ֎΁ͷରԠΛ͍͍ͯͨͩͨ͠Productνʔ Ϝ΍ɺมΘΒͣӦۀΛଓ͚͍͍ͯͨͩͨSalesνʔϜ͕ ͋ͬͯͦ͜ɺো֐Λ৐Γ੾Δ͜ͱ͕ग़དྷ·ͨ͠ɻ ·ͨɺ೔ࠒΑΓ୔ࢁͷϑΟʔυόοΫΛ͍͍ͯͨͩͯ͠ ͍Δ͓͔͛Ͱɺ૊৫Λม͑ΔΞΫγϣϯ͕औΕ͍ͯΔ͜ ͱΛײँ͓ͯ͠Γ·͢ɻ͋Γ͕ͱ͏͍͟͝·͢ɻ 

Slide 45

Slide 45 text

THANK YOU— Fringe81Ͱ͸ɺ৽͍͠ൃݟΛݩʹ஍ٿͷະདྷΛ ૑ΒΜͱ͢ΔΤϯδχΞΛืूதͰ͢ɻ ͋ͳͨͷಘҙͳ͜ͱͰҰॹʹউෛ͠·ͤΜ͔ɻ http://www.fringe81.com/recruit/