YAPC::Kansai OSAKA 2017 2017-03-04 #yapcjapan #yapcjapanB
ΧϠοΫͷήʔϜ։ൃɾӡ༻ͷʮࠓʯྗٕͱޮԽͷઌʹզʑ͕ʹͨ͠ͷͱ@mackee_w a.k.a macopyYAPC::Kansai 2017 OSAKA 2017-03-04
View Slide
͓લ୭ʁʁʁʁʁ
͓લ୭ʁʁʁʁʁ͓ࣄιʔγϟϧήʔϜͷαʔόαΠυͷ։ൃͱӡ༻ 1FSMHJUIVCNBDLFFUXJUUFS!NBDLFF@X1"64&."$01:ࣄ1FSM͕झຯ(P͕ ΄΅Α͘পʹؕΓ͕ͪ ࠷ۙ73
ࠓͷ:ʮ΅͘ΒͷߕࢠԂϙέοτʯͷӡ༻ͱ։ൃͷ
టष͍Λ͍ͬͯͧ̇͘
΅͘ΒͷߕࢠԂϙέοτͱʁ
΅͘ΒͷߕࢠԂϙέοτͷಛ• 14ճͷനͨ͠ࢼ߹ʂɹ܅ͷεΩϧͱΤʔϧ͕উഊΛ͚Δʂʂʂ-> 14ճόοναʔό͕age㽉age㽉͢Δ• ͻ͖ͬΓͳ͠ʹ։࠵͞ΕΔ༷ʑͳϛχήʔϜΠϕϯτʂʂʂɹٿҎ֎ָ͠ΊΔͧʂɹ-> ຖσϓϩΠຖ։ൃʘ(^o^)ʗ
ͱ͍͏ͷΛͲ͏Γ͍ͬͯΔ͔Λྺ࢙Λަ͑ͯհ͠·͢
ࠓ͔Β͢͜ͱ1. ߏͷมભͱDBICͱDateTime.pm2.ΨϯΨϯͬͯ͘ΔΠϕϯτΛӈ͔Βࠨ͍͖ͬͯ͢Δख๏ʹ͍ͭͯ3. 30ݸҎ্։ൃ༻ίϯςφཱ͕͍ͬͯͯ ͍ͭɹ͕ɹ͍ͬͯΔ+FOLJOTMPHPCZ+FOLJOT1SPKFDUIUUQTKFOLJOTJP
ߏͷมભͱDBICͱDateTime.pm
Πϯϑϥʹ͍ͭͯͪ͜Β͕ৄ͍͠IUUQTTQFBLFSEFDLDPNULVDIJLJOJBOKJBOZVOZPOHTJUFJSVTPTJZBSVHFNVGBMTFTBCBHPVDIFOHGBMTFCJBORJBO
ݱࡏͷΠϯϑϥߏ
ϦϦʔεॳͷΠϯϑϥߏ• உؾ͋;ΕΔγϯάϧϚελʔɾϊʔεϨʔϒ• ཧը໘εϨʔϒ• RDS for MySQL(5.6)• ElastiCache RedisͰͳ͘Redis SentinelͰӡ༻• WebAppͱBatchपΓߏʹมԽͳ͠• deploy͕Archer͔Βstretcherʹͳͬͨ͘Β͍• ϩάͷྲྀΕ͍ͩͿมΘ͍ͬͯΔ
ϦϦʔεॳͷ:ࢼ߹͕ॏ͍
ݱࡏͷ͋Δͷreq/sec
ݱࡏͷ͋Δͷreq/secϩʔΧϧϓογϡͰલͷഒͰۦ্͚͕Δ
͜Ε͕14ճ㽉㽉㽉㽉
ىͬͨ͜͜ͱ• όοναʔό͕ॏ͘ࢼ߹ਐߦ͕͔͔Γ͗͢Δ• DBͷෛՙͰଞͷAPIԆ࢝͠ΊΔ• ࢼ߹தεϨʔϒԆͰཧը໘͕10Εͱ͔ʹͳΔ• Redisͷసૹྔʘ(^o^)ʗ
ͬͨ͜ͱ• ͷࢼ߹Λຊͱ౦ຊͰ2ׂʹ͢Δ• ήʔϜͷνʔϜҬʹΑׂͬͯ͞Ε͍ͯΔ• 18࣌ͱ22࣌ͩͬͨͷΛ18/19࣌ͱ22/23࣌ʹ
14ճ㽉㽉㽉㽉↓16ճ㽉㽉㽉㽉㽉㽉
ϚελDBͷΫΤϦൃߦ
ͦͷଞ• DBICͰͷPrefetchͷ׆༻• N + 1ΫΤϦΛpt-query-digestͱ͔Ͱݟ͚ͭͯҰͭͷΫΤϦʹ·ͱΊΔ• RedisʹΩϟογϡ͍ͯ͠Δࢼ߹σʔλΛlz4Ͱѹॖͯ͠ऩΊΔ• WebAppαʔόԣʹฒΒΕΔ͔ΒগʑͷCPUίετ͏
ͦͷଞ• εϨʔϒԆIOPS͕Γͳ͔ͬͨͷͰIOPSΛ૿͢• ͓͔͔ۚΔ• ཧը໘ʹ͍ͬͯͨεϨʔϒʹ͚ΔΈΛຊ൪ΞϓϦʹద༻ͯ͠ϚελͷෛՙΛݮ͢Δ
͍͍ͩͨDBͰࠔ͍ͬͯΔ• RedisͰͷΩϟογϡͰ͖Δ͚ͩΘͳ͍ํ• ύʔςΟγϣϯʹΑΔ࣮ߦܭըͷ༳Ε• TEXTͷΧϥϜʹΊͪΌͰ͔͍JSONಥͬࠐΜͰసૹྔͶΔ• RDSͷϝϯςφϯε
Perlͷ
WebAppͰ͍ͬͯΔͭ• Perl 5.16.3 EOLͳͷͰ͍͋͛ͨ• Ark + DBIx::Class + DateTime.pm…• ΫϥεϏϧμMouseΛଟ༻͍ͯ͠Δ
ʮAPI͍͓ͨ͘͠ʙʯ• DBICศརɺ͔͍͠͠• ҎલDevel::NYTProfΛ͔͚ͨΒ΄΅DBICͱ͍͏݁Ռ͕ग़ͨ͜ͱ
DateTime.pm• DateTime.pmඇৗʹଟػೳ͕ͩੜίετ͕ߴ͍• $row->created_atͰऔΔͱDateTimeʹͳͬͪΌ͏ͷͰ$row->get_column(“created_at”)ͰऔͬͯeqΒlt/gtͰൺֱ͢ΔςΫ͋Δ• (Θ͔Γʹ͍͘)
DateTime.pmͱ͏Δ͏ඵ• Perl ͷ DateTime ར༻্ͷҙ• https://shogo82148.github.io/blog/2015/12/09/perl-datetime/• ςετதͷϩάʹ08:59:60ͱ͍͏จࣈΛݟ͚ͭͯɺͦͷ࣌ʹݪҼෆ໌ͩͬͨ࣍ͷ0࣌ͪΐ͏Ͳʹࢼ߹ΛಥͬࠐΉσόοά͕ΤϥʔͰࢮΜͰ͍ͨͷ͕͏Δ͏ඵͱΓमਖ਼ΛࢼΈΔ• ͔͠͠ίϯύΠϧ࣌ʹ͏Δ͏ඵΛຒΊࠐΜͰ͍ΔͷͰզʑϢʔβʹͲ͏͢Δ͜ͱग़དྷͶ͑• ͏Δ͏ඵΛΒͳ͍όʔδϣϯʹμϯάϨʔυͯ͠ରԠorz
͠Ύͬ͠Ύʔ
͠Ύͬ͠Ύʔ• ʮͳ͔ͬͨΒINSERT͍ͨ͠͠ɺ͋ΔͳΒϩοΫऔΓ͍ͨΜ?ʯ• http://ichirin2501.hatenablog.com/entry/2015/08/23/191500• INSERT͠Α͏ͱ͢Δͱdupͬͯɺ͡Ό͋͋ΔΜͬͯSELECT͠Α͏ͱ͢ΔͱREPEATABLEREADͷ᠘Ͱݟ͑ͳ͍ɻҰମͲ͏͢Ε
͠Ύͬ͠Ύʔ͕ى͜Δͱ• Α͘Πϕϯτ։࢝࣌ʹى͜Γ͕ͪ• Πϕϯτ༻ͷνʔϜڞ௨ϢʔβσʔλΛΠϕϯτͷγʔϯʹೖͬͨ࣌ʹ࡞Δͱ͔Δ• σʔλΛࣄલೖ͢ΔͷޮՌత• ͔͠͠ޙ͔Β࡞ΒΕͨϢʔβνʔϜʹޮՌ͕ͳ͍
ࠓͷͱ͜Ζͷରࡦํ๏• τϥϯβΫγϣϯ֎(ίϯτϩʔϥͷԼ͔ΒಡΜͩผͷϞσϧͷϝιουͳͲ)ͰॳظԽ͞ΕͨߦΛೖ͢Δ• ͦͷޙͷຊମͷϝιουͰͦͷߦͷϩοΫΛऔͬͯߦ͕͔ͳΒͣ͋ΔલఏͰॲཧΛଓ͚Δ• ͢ΔͱϩοΫऔΕΔͤ͠
ΨϯΨϯͬͯ͘ΔΠϕϯτΛӈ͔Βࠨ͍͖͍ͬͯͯ͘͠ख๏ʹ͍ͭͯ1IPUPCZ$BUXBMLIUUQTqJDLSQ(87V
͋ΔҰिؒͷ։ൃ
͋ΔҰिؒͷ։ൃݟʹ͍͘ͷͰਅͬೋͭʹ͠·͚ͨ͠ΕͲຊ͜Μͳײ͡Ͱ݄͢Րਫۚ
͜ͷύΠϓϥΠϯΛΓͳ͘εϜʔζʹ͍͖ͬͯग़དྷΔΑ͏ʹ͢ΔͷΤϯδχΞͷࣄ
ࠓօ͞Μʹ֮͑ͯ΄͍͜͠ͱ:֮ޛͱؾ߹
֮ޛ:αʔόʹσϓϩΠ͞ΕΔͷશͯαʔόΤϯδχΞ͕Λ௨͢
ͳͥͳΒͳΜ͔τϥϒͬͨͱ͖αʔόΤϯδχΞ͕Δ͔Β
αʔόʹσϓϩΠ͞ΕΔͷ• Perlͷίʔυ• CSVͰಥͬࠐΉϚελσʔλ• Unity͕ಡΉAsset Bundle• chefͷrecipe
αʔόʹσϓϩΠ͞ΕΔͷ• Perlͷίʔυ• CSVͰಥͬࠐΉϚελσʔλ• Unity͕ಡΉAsset Bundle• chefͷrecipe͜ΕΒશͯΛαʔόΤϯδχΞ͕Ѳ͢Δඞཁ͕͋Δ
͘͠୭͕͍ͬͯΔ͔ΛѲ͍ͯ͠Δඞཁ͕͋Δ-> ॿ͚ΛݺΔ
ؾ߹:పఈͨࣗ͠ಈԽ
։ൃͯ͢Pull RequestͰճ͍ͬͯΔ
ϒϥϯνΛΔBOT• ఆܗͷ໋໊نଇͱϒϥϯνπϦʔΛ࣋ͬͨtopicϒϥϯνΛࣗಈੜ͢ΔBOT• اըଆ͚ͩͰ࡞ۀΛ։࢝Ͱ͖Δ• hotfixϒϥϯνΕΔΑ͏ʹͳ͍ͬͯΔͷͰमਖ਼ͯ͠։ൃڥσϓϩΠ·ͰΤϯδχΞҎ֎͕ग़དྷΔΑ͏ʹͳ͍ͬͯΔ
͔͠͠؆୯ʹPRΛ࡞ΕΔͱ• No description…• ԿΛతʹ͜ͷPR͕࡞ΒΕͨͷ͔ॻ͔Εͣʹճ͖ͬͯͯࠔΔ
ԿΛ͔ͨ͠:ϙΤϜΛॻ͍ͨ
Τϥʔϝοηʔδ 2W1H ͕͍͍Μ͡Όͳ͍͔- @bayashi Dailyhttps://bayashi.net/diary/2016/07192W1HWhat? Why? How?
Pull Request2W1HͰ͍͍Μ͡Όͳ͍͔ʁ·ͩͬͯͳ͍͚ΕͲ13ͷςϯϓϨʹೖΕΔͷྑͦ͞͏
اըͷਓ͕ԿΛ੍࡞͢Δͷ͔ʁ
Ϛελʔσʔλ
Ϛελσʔλ• DB੩తϦιʔε্ͷϢʔβʹมߋ͞Εͳ͍σʔλ• ରٛޠϢʔβσʔλ• ϦϙδτϦʹCSVͰσϓϩΠ࣌ʹDBΫϥΠΞϯτʹ͢όΠφϦʹͳͬͨΓ͢Δ
Ϛελσʔλ• DBʹೖΔͷ͕େͳͷͰߗ͍εΩʔϚܗࣜ• CSVΛฤू͍ͯ͠ΔΘ͚Ͱͳ͘GoogleSpreadsheetΛ༻͍͍ͯΔɻ͜ΕΛCSVԽ͢Δ-> BOT͕CSVʹམͱͯ͠Pull Requestʹͯ͘͠ΕΔ
ԿނGoogle SpreadsheetͰΔ͔:͍͡Δਓ͕ίϯτϩʔϧͰ͖Δ
ΤΫηϧతͳͭͷ͍͍ͱ͜Ζ• දܭࢉͷ͕ؔ͑Δ• ؔΘΓ͔͠Θ͔Γ͍ࣗ͢ಈԽݴޠ• εΫϦϓτ͕͑Δ• σΟϨΫλʔ͕Կਓ͔GASॻ͍ͯࣗಈԽͯ͠Δ
ࣗಈԽΛઌͯ͠Δ͜ͱͰଞͷਓʹࣗಈԽΛଅ͢
ྫ͑Next IDൃߦ܅
͖ͬ͞ͷ͜Ε࡞ۀதͷͷ͕ฒྻ
͖ͬ͞ͷ͜Ε࡞ۀதͷͷ͕ฒྻͦΕͧΕʹϚελσʔλ͕ଘࡏ͢Δ
ͳͷͰ
શͯͷγʔτΛ·͍ͨͰͲͷIDʹ͖͔͢Λڭ͑ͯ͘ΕΔ܅͕ඞཁ
શͯͷγʔτʁʁʁ
͖ͬ͞ͷ͜Ε࡞ۀதͷͷ͕ฒྻͦΕͧΕʹಠཱͨ͠εϓϨουγʔτ͕ଘࡏ͢Δ
࣮ࡍʹCSVʹ͢Δͱ͖
࣮ࡍʹCSVʹ͢Δͱ͖ຊ൪ʹೖ͍ͬͯΔϚελͷγʔτ
࣮ࡍʹCSVʹ͢Δͱ͖ຊ൪ʹೖ͍ͬͯΔϚελͷγʔτΠϕϯτͰ͍͍ͨϚελσʔλͷγʔτ
࣮ࡍʹCSVʹ͢Δͱ͖ࠓσϓϩΠ͞ΕΔͱͲ͏ͳΔ͔$47
ͭ·ΓεϓϨουγʔτͷϒϥϯνཧ
େྔͷΠϕϯτΛճͨ͢Ίʹ• పఈͨࣗ͠ಈԽ• PullRequestͱγʔτͰݟ͑ΔԽͱ͍͡ΕΔԽΛ͢Δ• γʔτΛࠩཧͯ҆͠શʹ։ൃ• BOTͰͬͯ୭͕ԿΛ͍ͬͯΔ͔ΛSlackͰΕΔ
ͦΕͱେྔͷ։ൃڥ
։ൃڥͱ• ຊ൪ͱಠཱͨ͠ಛఆͷϒϥϯνͷίʔυͱϚελσʔλͱΞηοτ͕σϓϩΠ͞Εͨαʔό• ϗετ͕ৼΒΕͯ։ൃ൛ΞϓϦ͔Βܨ͛ΒΕΔ• ੲϩʔΧϧͰplackup͚ͯͨ͠ΕͲࠓͱͳͬͯPerlڥ͋ΔਓϩʔΧϧ͡Όͳͯ͘։ൃڥΛ্ཱͪ͛ͯ֬ೝ͢Δ͜ͱ͕ଟ͍
ੲ(৽ن։ൃॳ)ʮmacopy: ϒϥϯνhogehogeΛݟΕΔΑ͏ʹͯ͠ʯʮʔ͍ʯ͔ͬͯͬͯΒdevelopmentαʔόʹϩάΠϯͯ͠ϒϥϯνΛΓସ͑ͯεΩʔϚద༻ͯ͠ϚελಥͬࠐΜͰWebAppΛ࠶ىಈͯ͠…
ؾ͍ͮͨΒͣͬͱϒϥϯνσϓϩΠ৬ਓʹͳ͍ͬͯͨ
ΞΧϯͷͰBOTʹΒͤΔ• ಉ͜͡ͱΛBOTʹΒͤΔ• UnazuSanͱ͍͏ϞδϡʔϧΛ༻ͯ͠IRC͔ΒҰ࿈ͷσϓϩΠίϚϯυΛ࣮ߦ͢ΔΑ͏ʹͨ͠• ͜ΕͰίʔυ͕ॻ͚ΔΑ͏ʹͳͬͯϋοϐʔ
͔͜͠͠͏ͳͬͯ͘Δͱ
ಉ࣌ʹෳͷਓ͕ผʑͷڥΛݟ͍ͨͱ͍͏ཁ͕
͠Ό͋ͳ͍ͷͰෳڥΛ࡞Δ• devφϯτΧ͍ͬͯ͏αʔό͚ͩͩͬͨͷ͕ɺdev01, dev02, dev03ͱ૿͑Δ• ͔͍ͬͯ͠͠Δͷʹଞਓ͕͓͏ͱͯ͠ফ͢• εϓϨουγʔτΒϗϫΠτϘʔυͰཧ࢝͠ΊΔ
ͳ͓ಉ͡ঢ়گʹஔ͔ΕͨผͷνʔϜ͍ͬͯΔਓͷ্ʹ෩ધ͕͋Δͱ͍͏Ṗͷӡ༻Λ͍ͯͨ͠Β͍͠IUUQUFDICMPHLBZBDDPN@NJSBHF@JO@EPDLFSIUNM
͠ΐ͏͕ͳ͍ͷͰڥΛ૿͢• ʮڥμϒͬͯ͏͠ΜͲ͍ͷͰͳΜͱ͔ͳΓ·ͤΜ͔ʯ• ʮ͠ΐ͏͕ͳ͍૿͔͢……ʯҰϲ݄ޙʮdev14·Ͱ࡞ΔͨΊʹdevͰchefճ͠·͢ʯΠϯϑϥʮͳΜͰͦΜͳ͜ͱʹʂʁʯ
૿ͯ͠ॴḨ༗ݶͳͷͰ͢
͋”͋”ແݶʹ։ൃڥΆ͜Άཱ͍͓ͯͨ͜ʙ
+ mirage
(Ϧιʔε͕ڐ͢ݶΓͷ)ແݶͷ։ൃڥ• DockerͰϒϥϯνΓସ͑ͱcarton installͱDBϚΠάϨʔγϣϯΛߦͬͯplackup• Procletศར(ࢼ߹༻ʹgearmanͳͲཱͬͯΔ)• DBͱRedisલίϯςφʹཱ͍͕ͯͯͨɺϝϞϦͱσΟεΫ৯͏ͷͱίϯςφམͱ͢ͱશͯͳ͘ͳΔͷͰɺϗετʹRedisཱͯͯDBAuroraͰσʔλϕʔεΛ͚ͯಉډ͍ͯ͠Δ
(Ϧιʔε͕ڐ͢ݶΓͷ)
BOTͰڥΛ্ཱͪ͛ΕΔཪͰJenkins͕mirageͷAPIΛୟ͍ͯίϯςφىಈ͍ͯ͠Δ
͢ΔͱΈͳ͞Μ͖์ͳ͞ΕΔ
ίϯςφେരൃ
ίϯςφΠϝʔδআͱ͔සൟʹ͍ͬͯΔ͕0%ʹͳͬͯdev͕ࢮͨ͜͠ͱԿ͋ΔσΟεΫ༗ݶ
ͱΓ͋͑ͣσΟεΫΛεέʔϧΞοϓͨ͠ͷͱίϯςφͷμΠΤοτ
͋ͱࣥࣄౖ͕Δ͜ΕݟͯΈΜͳʮ͋ʙͬͯͳ͍ͷ͋ͬͨΘʯͬͯݴͬͯམͱ࢝͠ΊΔͷͰศར͋ͱ࣌ؒΞΫηε͕ͳ͚Εམͱ͢ͱ͔݄༵ேʹશ෦མͱ͢ िӽ͠ͷίϯςφ࣋ͨͳ͍ͱ͔ͬͯΔ+FOLJOTMPHPCZ+FOLJOT1SPKFDUIUUQTKFOLJOTJP
ϝϞϦͱCPU༗ݶ
ݪҼσόοά༻εΫϦϓτ͕ϝϞϦόΧ৯͍͔ͭฒྻ࣮ߦ• QAͳͲͰ͑ΔΑ͏ʹεΫϦϓτΛ࣮ߦ͢ΔWebUIΛ༻ҙ͍ͯ͠Δ͕ɺͦͷҰͭʹര͕͋ͬͨ• ͍ΘΏΔμϛʔσʔλ࡞Δܥɻ͜͏͍͏ͷίʔυϨϏϡʔ͕ૄ͔ʹͳΓ͕ͪͩ͠ɺຊ൪ͱҧ͏ෛՙʹͳΓ͕ͪ
ͦΜͳ͜ΜͳͰେྔʹڥΛཱͯΕΔ͜ͱʹΑͬͯेฒྻͷ։ൃ͕Մೳʹͳ͍ͬͯΔ
·ͱΊ• PerlݱͰಈ͍͍ͯ·͋͢ɻӡ༻͍ͯ͠·͋͢ɻ• ։ൃύΠϓϥΠϯΛਂͯ͘͠εέʔϧͤ͞ΔͱαʔϏεͷӡ༻ͷ෯͕͕Γ·͢• ͦΜͳΘ͚ͰوॏͳPerlΤϯδχΞ߈Ίӡ༻͢ΔͨΊʹύΠϓϥΠϯΈ͍ͨΤϯδχΞ͞Μ͍·ͤΜ͔ʔʔʔʔʔʂʂʂʂ[Ad]↓
ͦͷଞൃද͖͠Εͳ͔ͬͨͭ• ͋ͱ͔ΒϚϧνςφϯτʹ͢Δͱ͖ͷۤ࿑• σϓϩΠʹ͍ͭͯ(papix͕લʹ͍Ζ͍Ζ͍ͬͯΔΜ͡Όͳ͍͔ʁ)• ͍͜ͱ͍ͬͯΔͱϞδϡʔϧͷޙํޓഁյʹ·͞ΕΔ͕ΞάϨογϒʹ্͛Δ• ςετ͕20͔͔ΔͷͰۚͰԥΔ༧ఆͷ