Slide 1

Slide 1 text

θϩ͔Β࢝Ίͨ GunosyΞυαʔό։ൃӡ༻ه גࣜձࣾGunosy ҄൧ݪढ़հ

Slide 2

Slide 2 text

ࣗݾ঺հ • ҄൧ݪढ़հ (http://argmax.jp) • Gunosy։ൃຊ෦ Ϛωʔδϟʔ • ޿ࠂ഑৴γεςϜͷ։ൃશମͱR&DܥΛ୲౰ • ઐ໳: ܭࢉݴޠֶ • Pythonͱඇಉظ෼ࢄγεςϜΛ޷Ή • ը૾ॲཧɾԻ੠৴߸ॲཧͰ͍Ζ͍ΖϥΠϒϥϦ࡞ͬͯΔ • https://bitbucket.org/aihara

Slide 3

Slide 3 text

ɹɹGunosy Ads • χϡʔεΩϡϨʔγϣϯΞϓϦͷάϊγʔ಺ͷ޿ࠂ • ೖߘ͔Β഑৴·Ͱ׬શࣗࣾ੡ • ޿ࠂೖߘγεςϜҎ֎͸΄΅Python੡ • ࠷ۙscalaͱgo͕ೖ͖ͬͯͨ • End-to-EndͷRTBγεςϜ • ΞυωοτϫʔΫ΋࢝Ίͨ • iOS, Android, JS, Titanium޲͚SDKΛఏڙ

Slide 4

Slide 4 text

Ξυαʔό͸૯߹֨ಆٕ • ECPM(ऩӹੑ)Λ૿େͤ͞Δ༧ଌΞϧΰϦζϜͷߏங • CPA(ސ٬֫ಘ୯Ձ)Λ௿͘཈͑ͯ޿ࠂΛܧଓ • Ϣʔβʹͱͬͯ΋༗ӹͳ޿ࠂ৘ใΛ഑৴ • େن໛σʔλΛ҆ఆ/ߴ଎ʹॲཧ͠ϩδοΫʹ൓ө • 50ms or Die

Slide 5

Slide 5 text

Gunosy Adsαʔόߏ੒ 2360 19(!%-7 +#4/ ,:*'&5.8 MySQL +#$)"

Slide 6

Slide 6 text

Ξυαʔό։ൃͷجຊελϯε • ࠷ۙ·Ͱ޿ࠂ഑৴ΤϯδχΞ͸2໊ • AWSͰ༗Δ͜ͱΛ࠷େݶ׆༻ • TimeϕʔεͷϓϩϏδϣχϯά + େྔͷcold standby • ӡ༻ɾࢮ׆؂ࢹ͸ՄೳͳݶΓࣗಈԽ • αʔό૿΍͢ΑΓνϡʔχϯά(ශ๡ੑ) • ແବʹଟ͍KPI Tool

Slide 7

Slide 7 text

͜ͷҰ೥ΛৼΓฦΔ

Slide 8

Slide 8 text

1೥ͰGunosyϢʔβ਺͸10ഒ ޿ࠂ഑৴ྔ͸਺ઍഒʹ ਓ ਓ ਓ ਓ ਓ ਓ ਓ ਓ ਓ ݄ ݄ ݄ ݄ ݄ ࠓ μ΢ϯϩʔυ਺ ΞυΤϯδχΞਓ਺

Slide 9

Slide 9 text

͸͡Ί͸਺୆ͷαʔόͩͬͨ • Python(Tornado)੡ͷ഑৴αʔό • ΦϯϥΠϯֶश/όϯσΟοτͰCTRਪఆ • Redisʹ഑৴σʔλΛ͢΂ͯ౤ೖ • RDB͸Ұ੾ݟͳ͍ • MongoDBʹtd-agentͰϩάΛ౤ೖ • Capped Collectionʹ౤ೖ Redis MongoDB (Log Collector) Batch Server MySQL MySQL ഑৴αʔό

Slide 10

Slide 10 text

スパイキーなアクセスで サーバが死ぬ ϢʔβͷੵΈ͕ΓͰ λΠϚʔϕʔεͷఆ࣌1VTI͕໰୊ʹ

Slide 11

Slide 11 text

࠷ॳͷ໰୊͸CPUό΢ϯυ • ΞυαʔόΛTimeϕʔεͰϓϩϏδϣχϯά • ॏ͍ܭࢉΛAPIαʔόͰ͢Δͷ͕ؒҧ͍ • ϦΞϧλΠϜͷ౷ܭ஋Λଈ࣌൓ө͢ΔΑ͏ͳσʔλूܭ ܥͱόονܥΛߏங • ਺෼୯ҐͰ΋͘͘͞͞ճΔϨϕϧ ! • ͜ͷλΠϛϯάͰϕʔε͕΄΅׬੒

Slide 12

Slide 12 text

·ͩ·ͩτϥϒϧ΋ָ͍࣌͠ظ • ΄΅ϓϩτλΠϓͷ͓΋ͪΌΈ͍ͨͳ෺ͩͬ ͨͷͰ഑৴ϩδοΫपΓͷνϡʔχϯάָ͕ ͍͠ • αʔό૿΍͢ΑΓ͸ϒϥογϡΞοϓ • ΞΫηε਺΋ച্΋·ͩ·ͩ

Slide 13

Slide 13 text

ウルトラマン来襲

Slide 14

Slide 14 text

CMͷ։࢝ʹΑΓDAU͕ര૿

Slide 15

Slide 15 text

ਓ ਓ ਓ ਓ ਓ ਓ ਓ ਓ ਓ ݄ ݄ ݄ ݄ ݄ ࠓ μ΢ϯϩʔυ਺ ΞυΤϯδχΞਓ਺ ͜ͷ͋ͨΓ

Slide 16

Slide 16 text

Ϣʔβ΋޿ࠂ࿮΋૿͍͑ͯ͘ • ऩӹ΋૿͑ͯઈରʹࢭΊΒΕͳ͘ͳΔ… • ΦʔσΟΤϯεσʔλ͕RedisʹࡌΓ੾Βͳ͍ • Slave͕OOMͰࢮΜͩΓ • ΞΫηεͷεύΠΫ͸ΑΓܹ͘͠Redis͕٧·Γ࢝ΊΔ • MongoͷCapped Collectionʹ͸1೔෼͢Β৐Βͳ͘ͳ Δ

Slide 17

Slide 17 text

Redisͷߏ੒Λมߋ • ͢΂ͯͷΞΫηεʹڞ௨͢Δσʔλ(޿ࠂͷ৘ใ/୯Ձ ౳)ΛS3ܦ༝Ͱશαʔόʹ͹Β·͍ͯReadΛ࡟ݮ • Redis͕མͪͯ΋࠷௿ݶͷ഑৴͕Ͱ͖ΔΑ͏ʹͳͬͨ ! ! !

Slide 18

Slide 18 text

Redisͷߏ੒Λมߋ • σʔλछຖͷਨ௚෼ࢄ • twemproxyೖΕͯ΋σʔλྔ૿Ճ࣌ͷϝϯςφϯεෛ ՙ͸มΘΒͳ͍ͷͰਨ௚෼ࢄ / αΠζΞοϓͰରԠ • Riakݕ౼΋ɺ౰࣌͸ίετ໘Ͱબఆ͔Β֎Εͨ ! ! ϢʔβຖͷӾཡཤྺ Ϣʔβͷηάϝϯτσʔλ ޿ࠂຖͷ഑৴ύϥϝʔλ ΫϥΠΞϯτ͕σʔλछຖʹ 3FEJTαʔό੾Γସ͑

Slide 19

Slide 19 text

ूܭDBΛRedshiftʹ • fluent-plugin-redshiftʹύονΛ͋ͯͯϩάΛ ൒ϦΞϧλΠϜʹRedshiftʹ౤ೖ • ͱΓ͋͑ͣRedshiftʹೖΕΔͱָͰ͖Δ と思っていた……

Slide 20

Slide 20 text

アドネットワーク開始で 広告枠とログデータが爆発 Redshiftは死ぬ

Slide 21

Slide 21 text

࿮͕૿͑ͯόον΋૿͑ͨ • Pythonͷ෼ࢄTask-Queue(Celery)ϥΠϒϥϦͰ΄΅ແ վ଄Ͱ෼ࢄॲཧԽ • ႈ౳Ͱ૬ޓͷঢ়ଶʹґଘ͕ແ͍όονΛ࡞Δ • numpy, scipy, pandas, scikits౳ͷΤίγεςϜ͕ͦͷ··࢖͑Δ Amazon SQS ɾ
 ɾ
 ɾ Celery Workers Django-Celery

Slide 22

Slide 22 text

Redshift͕٧·Γग़͢ • Redshift͸ूܭର৅ςʔϒϧ͕ϝϞϦʹ৐Βͳ ͘ͳΔͱ్୺ʹ஗͘ͳΔ • Ϋϥελ਺૿ / ΠϯελϯεมߋରԠग़དྷΔ͚ Ͳߴ͗ͯ͢ROI͕߹Θͳ͘ͳͬͯ͘Δ • dw2.8xlargeߴ͗͢ • ੴ༉ԦͳΒdw2.8xlargeΫϥελΛ࢖͓͏

Slide 23

Slide 23 text

• Redshift͸͋͘·ͰσʔλϚʔτ • ఆৗूܭʹඞཁͳϝϞϦʹ৐Γ੾Δσʔλ ͷΈtemporalͳςʔϒϧʹ৐ͤΔ • ൒ࣗಈͰఆظϩʔςʔγϣϯ ϝϞϦʹ৐Βͳ͍Ϗοάσʔλ is ෆཁ

Slide 24

Slide 24 text

ϝϞϦʹ৐Βͳ͍Ϗοάσʔλ is ෆཁ • ඇఆظతͳ෼ੳ͸Sparkʹ • ශऀͷຯํEMR on Spot Instance • ΞυϗοΫͳ෼ੳͱ͔ճؼϞσϧߏங͸Spark Λར༻ • શϩάूܭ͸ImpalaͰ(ΦϯϝϞϦ͡Όͳ͍͚Ͳ)

Slide 25

Slide 25 text

DAU積み上がりと 記事タイトル付きPushで さらなるスパイクが…

Slide 26

Slide 26 text

ਓ ਓ ਓ ਓ ਓ ਓ ਓ ਓ ਓ ݄ ݄ ݄ ݄ ݄ ࠓ μ΢ϯϩʔυ਺ ΞυΤϯδχΞਓ਺ ͜ͷ͋ͨΓ

Slide 27

Slide 27 text

ࣾ಺ͷผαʔϏεͷվળͷӨڹ͕… • Pushͷهࣄબ୒ΞϧΰϦζϜͷվྑͰϢʔβ ͷ։෧཰͕େ෯޲্ • Remote Pushܥஔ͖׵͑Ͱ਺ඦສ݅1෼ҎԼͰ Delivery • APIαʔόͷεϧʔϓοτ͕վળ • Ξυαʔό΁ͷϦΫΤετ਺΋ര૿ • Too Slow To Die

Slide 28

Slide 28 text

͞Α͏ͳΒRedis͞Μ • Redisʹର͢ΔR/WΛͻͨ͢Β࡟ݮ • ΞΫςΟϒͳϢʔβ͚ͩ͸ϑΝΠϧDBʹͯ͠શ୆ʹ഑෍ • temporalͳσʔλΛͳͯ͘͠Statelessͳ഑৴ϩδοΫʹมߋ • Redisͱͯ΋ͭΒ͍͚Ͳ·ࣺͩͯΒΕͯͳ͍ • RiakͱMemcachedͷೋஈߏ੒͔Aerospikeͷٕज़ݕ౼ • Ͳͬͪʹͯ͠΋ͭΒ͍

Slide 29

Slide 29 text

ݟ͑ͯΔ஍ཕΛશͯ౿Έൈ͍ͯࠓʹࢸΔ 2360 19(!%-7 +#4/ ,:*'&5.8 MySQL +#$)"

Slide 30

Slide 30 text

·ͱΊ • Ұ೥ؒͰ͍͖ͳΓαʔϏε͕େ͖͘ͳΔͱ • ເͷٕज़͸ແ͍ͱ͍͏͜ͱ͕਎ʹ͠ΈΔ • ച্΁ͷϓϨογϟʔ͕ͭΒ͘ͳͬͯ͘Δ • ͦͷ෼ී௨ग़དྷͳ͍ܦݧ͕ੵΊΔ • GunosyͰ͸Python,Scala, Golang͕޷͖ͳΤϯδ χΞ͕޷͖উख΍ͬͯΔͷͰ༡ͼʹདྷ͍ͯͩ͘͞