Hatena EngineerSeminar #14ຐ๏ͷiΒΜͲ σʔλҠߦฤʙ৽چγεςϜؒͷσʔλϚΠάϨʔγϣϯ࣌ʹզʑ͕ߟ͑Δ͜ͱʙid:tkzwtksʢ୍ᖒ ਸʣ
View Slide
ࣗݾհ• id:tkzwtks ୍ᖒ ਸ• 201511݄ೖࣾ• ۀྺ• ΧΫϤϜʢKADOKAWA༷ʣ• GigaViewer• ͯͳμΠΞϦʔऴྃ(ͯͳμΠΞϦʔ͔ΒϒϩάͷҠߦ࡞ۀ)• Ҿӽ͠Ҋ݅3݅͘Β͍
վΊͯຐ๏ͷiΒΜͲ֓ཁ• KADOKAWA༷͕ӡӦ͢Δʮຊ࠷େڃͷΨʔϧζΤϯλςΠϝϯταΠτʯ• 1999ʹແྉϗʔϜϖʔδ࡞αʔϏεͱͯ͠ελʔτ• খઆߘػೳͰʮ࿀ۭʕφΠ࿀ޠʯͷਓؾ࡞͕ੜ·Ε͍ͯΔ• 20ͷখઆؔ࿈σʔλ͕ཷ·͍ͬͯΔ
ࠓ͢͜ͱ• σʔλҠߦͷͱ͖ʹ͑ΔϙΠϯτ• ৽چຐ๏ͷiΒΜͲؒͰσʔλҾӽ͢͠Δࡍʹզʑ͕ߟ͑ͨ͜ͱ• ͲͷΑ͏ʹҠߦ४උΛਐΊ͔ͨ• Ҡߦ࣌ͷ՝ͱͦͷղܾํ๏
ࠓ͢͜ͱ• σʔλҠߦͱʁ• ຐ๏ͷiΒΜͲʹ͓͚ΔσʔλҠߦ• σʔλѲ• Ҡߦॲཧ࣮/ࣄલ࣮ߦ/վળ• ฒྻ࣮ߦઃܭ/࣮• ·ͱΊ
σʔλҠߦͱʁ
σʔλҠߦͱʁچγεςϜ͔Β৽γεςϜʹσʔλΛҠ͢͜ͱ• DBͳΒ• εΩʔϚఆٛมߋແ͠ / มߋͭͭ͠Ҡߦ• ϑΝΠϧͳΒ• چετϨʔδ͔Β৽ετϨʔδͷҾӽ͠
σʔλҠߦ·ͰͷಓͷΓ• Ѳɾ࡞ઓཱҊ• ԿΛͲ͜ʹҠ͢ͷ͔ / ͲΕ͘Β͍Ҡ͢ͷ͔• ͲΕ͘Β͍͕͔͔࣌ؒΔ͔• ४උɾ࣮• ࣮ߦ
ຐ๏ͷiΒΜͲͷҾӽ֓͠ཁ
ԿΛͲΕ͘Β͍Ҡ͢ͷ͔ʁ• Ϣʔβʔσʔλʢ470ສਓʣ• ࡞ʢ132ສ࡞ʣ• Τϐιʔυʢ3000ສΤϐιʔυʣ
ԿΛͲΕ͘Β͍Ҡ͢ͷ͔ʁ• ͓͠Γʢ640ສʣ• ϨϏϡʔʢ219ສʣ• ࡞ͷԠʢ144ສʣ• খઆૠֆ/ϓϩϑΟʔϧը૾ʢ500ສϑΝΠϧʣ
Ҿӽ͠ʹ͓͚Δ՝• γεςϜͷશϦχϡʔΞϧ• ΧΫϤϜͱίʔυϕʔε͕ಉ͡• ৽چγεςϜؒͰεΩʔϚఆٛҧ͏• ه๏ҧ͏ͷͰશΤϐιʔυॻ͖͑ͳͯ͘ͳΒͳ͍• σʔλؒͷґଘؔΛղܾ͠ͳ͕ΒҠߦ͢Δඞཁ͕͋Δ• ྫ) ࡞ͱͦͷ࡞ऀ / ը૾ͱͦͷΦʔφʔ
༰ΛѲ͢Δ
σʔλϚοϐϯά• چεΩʔϚ͔Β৽εΩʔϚʹରԠ͢Δςʔϒϧ/ΧϥϜΛݟ͚ͭΔ• ৽εΩʔϚͰඞཁͳσʔλΛͯ͢ચ͍ग़͠ɺچεΩʔϚ͔ΒରԠ͢ΔΧϥϜΛݟ͚ͭΔ• چγεςϜ͔ΒҠߦ͢Δඞཁ͕͋ΔσʔλͷҠߦઌͷςʔϒϧ/ΧϥϜ͕ଘࡏ͢Δ͔ચ͍ग़͢
Ҡߦରͷચ͍ग़͠• Ҡߦ͢Δͷ / ͠ͳ͍ͷΛܾΊͯΛग़͢• ྫʣୀձࡁΈϢʔβʔͱͦͷ࡞Ҡߦ͠ͳ͍• Λग़ͯ͠ɺҠߦظؒͷݟੵΓʹར༻͢Δ
ྫ ࡞/ຊจͷҠߦ• ࡞λΠτϧຊจ৽γεςϜͷରԠ͢ΔΧϥϜʹϚοϐϯά͢Δ• ݪଇͱͯ͠ҠߦલޙͰʮมߋ͠ͳ͍ʯ• چεΩʔϚͷෳͷσʔλΛࢀর͠ͳ͍ͱܾఆͰ͖ͳ͍ͷ͋Δ• ެ։ϑϥάʢ࡞ɾখઆຊจʣ ষɾઅͷઃఆ• ϚοϐϯάҎ֎ʹมϩδοΫ͕ඞཁ
Ҡߦॲཧͷ࣮
Ҡߦॲཧͷ࣮ํ• Ҡߦରσʔλͷछྨ͕ଟ͍ͷͰɺ֤ॲཧΛผʑͷόονॲཧͱ࣮ͯ͢͠Δ• ෳͷछྨͷσʔλҠߦΛฒߦ࣮ͯ͠ߦͰ͖ΔΑ͏ʹ• ෳਓͰ࣮͍͢͠Α͏ʹ• ֤ॲཧΛγϯϓϧʹอͭΑ͏ʹ• ֤ॲཧผͷΈͰ࿈݁͢Δ
Ҡߦॲཧͷ࣮ํ• ͍͖ͳΓ࡞Γࠐ·ͳ͍• ࠷ॳͱʹ͔͘ಈ͔͢͜ͱΛඪʹ• ఆ͍ͯ͠ͳ͍σʔλଘࡏ͢Δલఏʹཱͪଓ͚Δ• ͋Δఔಈ͘Α͏ʹͳͬͨΒɺ࣮ࡍʹશ݅ʢ͋Δ͍ݱ࣮తʹऴΘΔ͘Β͍ͷྔʣͰ࣮ࡍҠߦΛࢼ͍ͯ͘͠• ఆ͠ͳ͍σʔλ͕͖ͨΒΤϥʔͰམͪΔΑ͏͢Δ
Ҡߦॲཧͷ࣮ํ• Ͱ͖Δ͚ͩಛผͳ͜ͱΛ͠ͳ͍• Ϣʔβʔ͕࣮ࡍʹૢ࡞͢Δ߹ͱಉ͡Α͏ͳσʔλ͕࡞ΒΕΔΑ͏ʹ͢Δ• কདྷʹʮ໌Β͔ʹ͓͔͠ͳσʔλʹݟ͑ΔΜ͚ͩͲ͜Ε͍ͭͲ͏ͬͯ࡞ΒΕͨΜͩΖ͏ʯͱͳΔͷΛආ͚͍ͨ• DB্ͷσʔλͷมߋཤྺ͍ʹ͍͘
࣮• ࠷ॳҠߦઌͷίʔυΛྲྀ༻͢ΔܗͰ֤ҠߦॲཧΛ࣮• Ҡߦ࣌ʹ͓͔͠ͳσʔλ͕࡞ΒΕΔͷΛ͙ͷ͕ૂ͍• WebଆͱͰ͖Δ͚ͩಉ͡ϩδοΫΛ͏͜ͱͰɺෆશͳσʔλ͕࡞ΒΕͳ͍Α͏ʹ
ࣄલ࣮ߦ/վળ
࣌ؒΛݟੵΔ• ࣮σʔλͰࢼ̐͢• શମͷྔ/Ұ݅͋ͨΓͷҠߦʹ͔͔Δ࣌ؒΛग़͢• ϝϯςφϯεظؒͷݟੵΓ• શͯͷύλʔϯΛཏ͢Δඞཁͳ͍• ݟੵΓͳͷͰશ݅ࢼ͞ͳͯ͘Α͍• ࣮ → ࣮ߦ → मਖ਼ͷαΠΫϧΛճ͍ͯ͘͠
ຐ๏ͷiΒΜͲͰͷ࣌ؒݟੵΓ• ಈ͘Α͏ʹͳͬͨ͘Β͍Ͱ͓ࢼ࣮͠ߦ• ૉʹ࣮ߦͯ͠ΈΔͱɺҰϲ݄Λͪΐͬͱ͑ͦ͏ͱ͍͏͜ͱ͕Θ͔Δ• ͜ΕͩͱҰൃউෛʹͳͬͯ͠·͏• λΠϜϦϛοτ͕2݄ޙʹͳΔ/ϝϯςφϯεظ͕ؒ͘ͳΓ͗͢Δ• ॲཧࣗମͷվળͱฒྻ࣮ߦ͢ΔΈͷಋೖͰରԠ͢Δ
Ҡߦॲཧͦͷͷͷվળ• ҠߦॲཧࣗମΛ࠷దԽ͢Δ• ࠷ॳwebଆͱಉ͡ίʔυΛར༻͓ͯ͠ΓɺҰ݅ͣͭINSERT͢ΔϩδοΫʹͳ͍ͬͯͨʢ͍ΘΏΔn+1ʣ• webଆͱಉ͡ίʔυΛͦͷ··ར༻͢ΔͷΛఘΊͯɺෳϨίʔυΛbulk insert͢Δίʔυʹม͍͑ͯ͘• INSERT͕ϝΠϯͳͷͰେ෯վળ• UPDATEʹ͍ͭͯఘΊΔ
ฒྻ࣮ߦ
Ҡߦͷ࡞ઓݕ౼Ͳ͏ͬͯૉૣ͘Ҡߦ͢Δʁ• ฒྻΠϯϙʔτ & ฒྻΛͰ͖Δ͚ͩ૿͢• ྻʹͬͯ100͔͔ΔͳΒɺ୯७ܭࢉͰ100ฒྻͳΒ1ͰऴΘΔ• ฒྻউखʹ্ݶ·Ͱ૿͑ͯཉ͍͠
Ͳ͏ͬͯฒྻ࣮ߦ͢ΔʁϚωʔδυαʔϏεΛಋೖͰղܾΛਤΔ• AWS Batch + StepFunctions• BatchͰҠߦॲཧࣗମΛ࣮ߦ• ґଘ͢ΔBatchॲཧΛStepFunctionsͰͭͳ͙• StepFunctionsͰBatchͷδϣϒΛૹ৴ͭͭ͠ɺਐḿཧΛߦ͏ΈΛͭ͘Δ
AWS Batch• ϑϧϚωʔδυͳόονॲཧ࣮ߦڥ• Ϧιʔεʹ༨༟͕͋ΔݶΓδϣϒΛฒྻ࣮ߦͯ͘͠ΕΔ• DockerΠϝʔδ͕͋Ε͑ΔͷͰɺٕज़બͷ෯͕͍• Lambdaͱͷҧ͍͜͜• ୯ମͰಈ͘όονॲཧͱͯ͠ಈ͘ͷΛࡌ࣮ͤͯߦ
AWS StepFunctions• AWSͷෳαʔϏεΛΈ߹ΘͤͯϫʔΫϑϩʔΛ࡞• ϫʔΫϑϩʔεςοϓͷΈ߹ΘͤͰߏ͞ΕΔ• ֤εςοϓࣗಈతʹτϦΨʔ͞ΕɺτϨʔε͞ΕΔ• ෳͷॲཧΛͭͳ͛ͯҰ࿈ͷॲཧΛͭ͘Δ• ׂ͞Ε֤ͨఔ͕εςοϓͱͳΔ
AWS StepFunctions• 2019/9ʹαϙʔτ͞ΕͨMap͕ڧྗ• ಈతฒྻॲཧΛ؆୯ʹॻ͚Δ• Ҡߦର͕ॻ͔ΕͨJSONͷS3ΩʔͷྻΛͯ͠ɺ֤Ωʔ͝ͱʹBatchΛ࣮ߦ͢ΔɺΈ͍ͨͳ͜ͱ͕ॻ͚Δগ͠ࢼͨ͠ͱ͜Ζɺ͏·͍͖ͦ͘͏ͳࢉஈ͕͍ͭͨͷͰ࠾༻
σʔλҠߦਐḿཧ
σʔλҠߦਐḿཧ• σʔλҠߦͦͷͷͷਐḿΛཧ͓ͯ͘͠• Ҡߦલ/ॲཧޭ/ࣦഊͷঢ়ଶཧ• ࣦഊͨ͠σʔλ࠶ҠߦͰ͖ΔΑ͏ʹ• Ͳ͏ͬͯཧ͢Δ͔• ӬଓԽͰ͖ΕͲ͏͍͏ํ๏Ͱ͍͍
Savepoint• ࠓճҠߦରͷҠߦݩIDҰཡ͕هड़͞ΕͨJSONΛS3ʹஔ͘ΓํΛ࠾༻• JSONϑΝΠϧҰ͕࣮ͭߦ୯Ґʹͳ͍ͬͯͯɺͦΕͧΕ͕ฒྻʹ࣮ߦՄೳ• ֤ఔͰͰ͖Δ͚ͩฒྻ࣮ߦͰ͖ΔΑ͏ʹ• ͍͍ͩͨಉ݅͡ʢbatch_sizeʣʹͳΔΑ͏ʹۉ͞Ε͍ͯΔ
Savepoint• S3ͷΩʔͰʮҠߦରͷछྨ/Ҡߦݩ/Ҡߦͷ൱ʯΛදݱ͢Δ• ΩʔΛݟΔͱҠߦঢ়ଶ͕Θ͔Δ• ࣮ߦલ/ޭ/ࣦഊ• ࣦഊͨ͠άϧʔϓ࠶࣮ߦՄೳ
ॲཧ݅ΛۉҰʹ͢Δ֤ॲཧͷॲཧ݅Λ͍͍ͩͨಉ͡ʹۉ͢• Ϣʔβʔ100ਓ ͷάϧʔϓΛ͍͔ͭ͘࡞ͬͯฒྻ࣮ߦ͢Δͱͯ͠• ͦΕͧΕ͕࣋ͭ࡞খઆຊจͷ߹ܭόϥόϥ• ͦΕͧΕͷఔΛྻͰॲཧ͢Δ߹ɺʹΑ࣮ͬͯߦ͕࣌ؒมΘΔ• ͕࣌ؒಡΈʹ͘͘ͳΔ
ॲཧ݅ΛۉҰʹ͢Δ• ॲཧ݅ΛۉҰʹ͢Δ͜ͱͰ֤ॲཧͷ࣮ߦ࣌ؒΛ֓Ͷಉ͡ʹͰ͖Δ• savepointͷΦϒδΣΫτΛࢹ͢Δ͜ͱͰେମͷਐḿΛࢹՄೳ• ࣮ߦલͷ݅/ޭ/ࣦഊ
ͨ͠εςʔτϚγϯ
ͦͷଞ
ը૾ͷҠߦը૾ͷҠߦʹS3 BatchOperationsΛར༻• Ҡߦݩͷը૾ετϨʔδ͔ΒҰS3ͷҰ࣌ஔ͖ʹू͢Δ• Ұ࣌ஔ͖͔Β৴༻όέοτͷҠಈʹS3BatchOperationsΛར༻• LambdaΛڬΜͰը૾ΛϦωʔϜ• େମ2࣌ؒఔ
Ҡߦ݁Ռͷݕূ• ࣄલʹ݅Λग़͓͍ͯͯ͠ɺҠߦ݅ͱൺֱ• ݕূରΛࣄલʹ͍͔ͭ͘ग़͓͍ͯͯ͠ɺҠߦલޙͰҧ͍͕ͳ͍͔Λൺֱ• ݟͨʹؔ͢Δ෦࣮ࡍʹݟͯ֬ೝ• ͜͜վળͷ༨͕͋ͬͨ
݁Ռͱ·ͱΊ
݁Ռ• શ݅Ҡߦ͕εϜʔζʹऴΘΔͱ͍͍ͩͨ10~14h͘Β͍• ۚમతίετͦΜͳʹ͔͔Βͳ͍• BatchࣗಈͰඞཁͳαΠζͷEC2ΠϯελϯεΛཱͯΔ͕ɺཱ͍ͬͯΔ͍࣌ؒ• খ͍͞ΠϯελϯεͰ࣌ؒΛ͔͚ΔΑΓଟগ͓͕͔͔ۚͬͯߴʹऴΘΔํ͕ϦΧόϦ͍͢͠
·ͱΊ• ҠߦॲཧΛׂ͢Δ࡞ઓ͕Α͔ͬͨ• ίʔυ͕ѻ͍͍͢ɺಈ࡞֬ೝͷείʔϓΛݶఆͰ͖Δ• ϚωʔδυαʔϏεͷಋೖ• ࣮ߦڥͷ४උίετΛԼ͛ΒΕͨ• ࣗಈͰεέʔϧΞτͯ͘͠ΕΔͷָ
·ͱΊ• ݴޠબఆ• ݁ՌతʹΫΤϦΛେ෯ʹॻ͖͑ͨͷͰWebଆͱಉ͡ݴޠΛ࠾༻͢ΔࢫΈݮͬͨ• ҰํطଘͷॲཧΛਖ਼͘͠࠶࣮͢Δͷ͘͠ɺDBʹೖΕΔલ·Ͱಉ͡ॲཧ͕͑ͨͷྑ͔ͬͨ• ແࣄʹҠߦͰ͖ͨ• ԿΑΓ͜Ε͕Ұ൪