Rails Developers Meetup 2019の発表に利用した資料です。
Scalable Microservice for Media TranscodingञҪ ಞ @_atsushisakaiגࣜձࣾϛΫγΟRails Developers Meetup 2019
View Slide
ञҪ ಞ @_atsushisakai• ՈΞϧόϜʮΈͯͶʯΛ։ൃ͍ͯ͠·͢• SRE• Ruby on Rails• AWS• iOS/Android• Engineering Manager• iOSDC/DroidKaigi• RailsDM͡Ίͯ
AgendaʮΈͯͶʯͰ͏ɺಈըฤूɾτϥϯείʔυϚΠΫϩαʔϏεͷ͓ɻ• ͳͥ࡞ͬͨͷ͔ʁ• ղܾ͍ͨ͠ཁ݅ɾ՝ͩͬͨͷ͔ʁ• Ͳ͏ͬͯղܾͨ͠ͷ͔ʁ
·ͣͪ͜ΒͷಈըΛ͝ཡ͍ͩ͘͞!
ಈը(WIP)
͜ΕҰମ…ʁ• ʮ1ඵಈըʯͱ͍͏ࢠͲͷΛৼΓฦΔػೳ• େྔʹΞοϓϩʔυ͞ΕͨಈըࣸਅΛૉࡐͱͯ͠μΠδΣετಈըΛ࡞• ൢച͢ΔDVDʹऩͨ͠ΓɺΞϓϦʹ৴ͨ͠Γ͢Δ• ଟ༷ͳޮՌΛ͚ͯࢠҭͯͷࢥ͍ग़Λ࡞ʹ͢Δ• ͍ಈըΛͬͯɺผͷಈըͱ݁߹͢Δ• WatermarkΛ͚ͭΔʢͳͲͷը૾ΛΓ͚ͭΔʣ• ΤϑΣΫτΛ͚ͭͯܨ͛ΔʢΫϩεϑΣʔυͳͲʣ• BGMΛ͚ͭΔ
1ඵಈըΛࣗಈͰେྔʹ࡞Δ
͍͍ײ͡ʹͰ͖ΔϚωʔδυαʔϏεͳ͍Ͱ͔͢ʁ• ྫ͑ɺAWS ElasticTranscoder• Ͱ͖Δ͜ͱ• Watermark͚ͭΕΔ• ಈըͷ݁߹Ͱ͖Δ• Ͱ͖ͳ͍͜ͱ• ׂͨ͠ΓɺΤϑΣΫτ͔͚ͨΓɺͱ͍͏͜ͱ͕Ͱ͖ͳ͍• Իͱͷ߹ͱ͍͏ͷͰ͖ͳ͍
࡞Δ͔͠ͳ͍…
Ͳ͏ͬͯʁΓग़͠ϦαΠζͳͲͷલॲཧෳͷಈըΛ݁߹Իָͱ߹ Ռ͕ʂ
Ͳ͏ͬͯʁΓग़͠ϦαΠζͳͲͷલॲཧෳͷಈըΛ݁߹Իָͱ߹ Ռ͕ʂ͍ΘΏΔύΠϓϥΠϯॲཧ%
͜͜Ͱݴ͏ύΠϓϥΠϯॲཧͱ• ffmpegʹΑΔมॲཧΛྻʹ࿈݁ͨ͠ͷ• લͷॲཧͷΞτϓοτ͕࣍ͷॲཧͷΠϯϓοτͱͳΔ
Έͳ͞ΜͳΒͲ͏࣮͠·͔͢❓
࠷۪ͳ࣮
࠷۪ͳ࣮ffmpegΛॱ൪ʹ࣮ߦ͍ͯ͘͠εΫϦϓτΛͳΜΒ͔ͷݴޠͰॻ͍͍ͯ͘• ύϑΥʔϚϯεͷ͕ग़ͯ͘Δ• ྻͷॲཧΛಈը1݅ͣͭʹରͯ͠ॱ൪ʹ͍ͬͯͨΒ͕࣌ؒແݶʹඞཁ• ٸʹ৴ରͷϢʔβʔ͕૿͑ͨΒͲ͏͢Δʁ• ίετͷग़ͯ͘Δ• CPU/ϝϞϦ͕༨ͬͨঢ়ଶͰ͍ͬͨͳ͍• ޮతͳϦτϥΠ͕Ͱ͖ͳ͍• ్தͰࣦഊͨ͠Β࠷ॳ͔Β…
ฒྻ࣮ߦ͢ΔΑ͏ʹ࣮
ฒྻ࣮ߦ͢ΔΑ͏ʹ࣮ύΠϓϥΠϯΛಉ࣌ʹෳΒͤΔͱɺ͖ͬͱύϑΥʔϚϯεྑ͘ͳΔ• ϚϧνϓϩηεϓϩάϥϛϯάΊͬͪΌͦ͠͏• ઈରʹόάΒͤΔࣗ৴͕͋Γ·͢• ύϑΥʔϚϯε͋ΔఔΑ͘ͳΔ͔͠Εͳ͍͚ͲνϡʔχϯάͰ͖ͳͦ͏• Ҿ͖ଓ͖ϦτϥΠॲཧͦ͠͏
SidekiqRubyͷ Job Queue γεςϜͰͱͯ༗໊ͳgemɻΦεεϝɻʮΈͯͶʯͰ100Ҏ্ͷSidekiq͕ಈ͘αʔόʔ͕ৗʹಈ͍͍ͯΔɻ• ύϑΥʔϚϯε͕ͱʹ͔͘ྑ͍• Resque/DelayedJobͷ20ഒۙ͘ߴ• https://github.com/mperham/sidekiq#performance• όʔδϣϯΞοϓʹΑΓͲΜͲΜύϑΥʔϚϯε͕ྑ͘ͳΔ• ଞͷGemґଘ͕ͱͯগͳ͍• ๛ͳެࣜυΩϡϝϯτɺ׆ൃͳ։ൃ• ActiveJobͰAdapter͕ఏڙ͞Ε͍ͯΔ
Sidekiq
Sidekiq ProSidekiqʹ՝ۚ͢Δͱྑ͍͜ͱ͕͋Γ·͢ɻhttps://sidekiq.org/products/pro.html• ϝʔϧαϙʔτΛड͚ΒΕΔ• Job͕ϩετ͠ͳ͍ͨΊͷReliabilityػೳ• ෳࡶͳϫʔΫϑϩʔΛ࡞Δ͜ͱ͕Ͱ͖ΔBatchػೳ
Sidekiq Batch• Sidekiq Pro ݶఆͷػೳ• ୯७ͳWorkerͷॲཧʹґଘؔΛ࡞Δ• ෳͷ Worker ΛଋͶͯɺͦͷ Batch͝ͱʹॲཧΛਐΊ͍ͯ͘• ͻͱͭͷ Batch ͕ऴΘΔͱ Callback͕࣮ߦ͞Εɺ࣍ͷॲཧʹਐΉɺͱ͍͏ॲཧΛهड़͢Δ͜ͱ͕Ͱ͖Δ• ͨͱ͑ D ͕ࣦഊͯ͠ D ͚ͩϦτϥΠͯ͘͠ΕΔA B CD
ͬͱෳࡶͳBatchॲཧ• A͕ऴΘΔͷΛͬͯBʙF͕ىಈ• BʙFύϥϨϧʹىಈ͢Δ• BʙF͕ऴΘͬͨΒGΛىಈ͢Δ• …͓ɺ͜Ε…ʁʁhttps://github.com/mperham/sidekiq/wiki/Really-Complex-Workflows-with-Batches
Ͳ͏ͬͯ࡞ΔʁΓग़͠ϦαΠζͳͲͷલॲཧෳͷಈըΛ݁߹Իָͱ߹ Ռ͕ʂSidekiq BatchΛ͏͜ͱͰతͷύΠϓϥΠϯ͕࣮Ͱ͖ͦ͏‼
ύΠϓϥΠϯ࣮Ͱ͖Δ͔ʁׂͱཧʹ͍ۙ☺• جຊతʹͨͩͷSidekiq WorkerͳͷͰ͓खܰʹฒྻॲཧͰ͖Δ• ϓϩάϥϛϯά؆୯• ޮతͳϦτϥΠ͕ߦΘΕΔ• SidekiqͷฒྻઃఆΛ্͛ΔͱCPU͕༨͍ͬͯΔݶΓߴԽ͍ͯ͘͠• CPU͕Γͳ͚Εεέʔϧͤ͞Δ
Transcoder
ϚΠΫϩαʔϏεͱͯ͠ͷ࣮• ผαʔϏε͔ΒTranscoderͷϦΫΤετAWS SQSΛܦ༝͢Δɻ• ඇಉظɾૄ݁߹ʹαʔϏεؒ࿈ܞ• ࣮ߦ݁ՌAWS SQSʹͤͯฦ͢• தؒϑΝΠϧՌAWS S3ʹอଘ͢Δ• αʔϏεؒΦϒδΣΫτ໊ͷΓͱΓͷΈ• ࣮ϑΝΠϧ͏ଆ͕औΓʹߦ͘
αʔϏεͷεέʔϥϏϦςΟ• ffmpegϞϦϞϦͱCPUΛ͏• ffmpegΛ࣮ߦ͢ΔWorker͕ͨ͘͞ΜQueueʹੵ·Ε͍ͯΔ࣌ʹίϯϐϡʔτϦιʔεΛΦʔτεέʔϧ͠ɺશମͷॲཧೳྗΛ্͛ΔʢAWS EC2ͷAutoScaleػೳͰ༰қʹରԠՄೳʣ
Transcoder γεςϜߏ• શͯAWSͷαʔϏεΛར༻ͨ͠ઃܭ• DBͱͷΓऔΓͷՕॴͰখنʹRails͕ಈ͘γεςϜ
Transcoder γεςϜߏ1. ଞͷαʔϏεͱͷೖग़ྗΠϯλʔϑΣʔεSQSΛ༻͍Δ1234 56
Transcoder γεςϜߏ1. ଞͷαʔϏεͱͷೖग़ྗΠϯλʔϑΣʔεSQSΛ༻͍Δ2. SQSΛPolling͢ΔΠϯελϯε1234 56
Transcoder γεςϜߏ1. ଞͷαʔϏεͱͷೖग़ྗΠϯλʔϑΣʔεSQSΛ༻͍Δ2. SQSΛPolling͢ΔΠϯελϯε3. SQS͔ΒऔΓग़࣮ͨ͠ߦґཔΛSidekiq BatchͰॲཧ͢Δ1234 56
Transcoder γεςϜߏ1. ଞͷαʔϏεͱͷೖग़ྗΠϯλʔϑΣʔεSQSΛ༻͍Δ2. SQSΛPolling͢ΔΠϯελϯε3. SQS͔ΒऔΓग़࣮ͨ͠ߦґཔΛSidekiq BatchͰॲཧ͢Δ4. RDSʹґཔ͞Εͨ༰Λอ࣋ɾࢀর͢ΔʢActiveRecordʣ1234 56
Transcoder γεςϜߏ5. Sidekiq ͷ Job ΛӬଓԽ͢ΔόοΫΤϯυͱͯ͠ͷRedis1234 56
Transcoder γεςϜߏ5. Sidekiq ͷ Job ΛӬଓԽ͢ΔόοΫΤϯυͱͯ͠ͷRedis6. தؒੜɾ࠷ऴՌΛอଘ͢ΔS3όέοτ1234 56
Transcoder ͷΞʔΩςΫνϟJobͱResult• JobɺSQSʹͤΔJSONͷ͜ͱ• ܕࣄલʹఆٛ͞Ε͍ͯΔ• SQSΛPolling͠ɺTranscoderඇಉظʹॲཧΛ։࢝͢Δ• ResultɺSQSʹͤΔॲཧ݁ՌͷJSONͷ͜ͱ• ܕࣄલʹఆٛ͞Ε͍ͯΔ• SQSΛґཔͨ͠ଆ͕Pollingͯ݁͠ՌΛड͚ͱΔ• ݁Ռ͕Errorͷ߹ʹErrorResultΛฦ͢
Transcoder ͷΞʔΩςΫνϟPipeline• JobͷೖྗΛड͚ɺ࠷ޙʹResultΛग़ྗ͢Δ·ͰͷશମͷॲཧΛ࣮• = Sidekiq Batchͷ࣮ͦͷͷɻ͜ΕࣗମSidekiq Worker• ෦ʹෳͷStepΛ࣋ͭ• Pipeline͝ͱʹՌ͕ఆٛ͞Ε͍ͯΔ• ʮΞϓϦ৴ʯ༻ͷಈըΛͭ͘ΔPipeline• ʮDVDʯ༻ͷಈըΛͭ͘ΔPipeline
Transcoder ͷΞʔΩςΫνϟStep• Pipeline͕ఆٛͨ͠ෳͷWorkerͷଋͷ͜ͱΛ͜͏ݺΜͰ͍Δ• = Sidekiq Batchʹ͓͚ΔBatchͷ͜ͱ• Step͝ͱʹCallbackΛΩοΫ͠ɺ࣍ͷStepʹҠΔ
Transcoder ͷΞʔΩςΫνϟWorker• StepͷͻͱͭͣͭͷSidekiq Workerͷ͜ͱ• ͯ͢Sidekiq্Ͱඇಉظɾฒྻʹ࣮ߦ͞ΕΔ• جຊffmpegͷίϚϯυΛҰճ࣮ߦ͢ΔཻͰ࣮͢Δ• ffmpegͷ࣮ߦ݁Ռͷग़ྗϑΝΠϧS3ʹอଘ͢Δ
Transcoder ͷΞʔΩςΫνϟCommand• WorkerͰ࣮ߦ͢ΔffmpegίϚϯυΛڞ௨ԽͷͨΊʹϥΠϒϥϦԽͨ͠ͷ• ୯ʹffmpegΛ࣮ߦ͠ɺͦͷ݁ՌΛϑΝΠϧͱͯ͠ड͚औΔ͚ͩ
PipelineStep Step StepWorker+ Command
PipelineStep Step StepWorker+ CommandSidekiq BatchͰղܾ
Sidekiq Batch࣮ͷίπ• Batch෦ͷWorkerґଘΛ͘ɺཻ͔ͭΛখ࣮͘͢͞Δɻ• εέʔϧ͍͢͠ɺϦτϥΠ͍͢͠ɺͳͲͷతɻ• ෳࡶͳBatchΛ࡞Δ߹ɺPipelineΛදݱ͢ΔίʔυͲΜͲΜංେԽ͢Δ• Callbackͷ࣮ߦQueueͪΌΜͱઃఆͨ͠ํ͕ྑ͍ɻ• Callbackॲཧ࣮ମSidekiq Workerͱͯ͠ॳظԽ͞Εɺ࣮ߦ͞ΕΔɻ• େྔʹߴͳCallback͕࣮ߦ͞ΕΔͱRedisʹෛՙ͕ҟৗʹ͔͔ͬͯࢮ…
͕࣌ؒͳͯ͘Ͱ͖ͳ͔ͬͨ͜ͱ• ಈըมύϥϝʔλͷPresetػೳΛ࡞Γ͔ͨͬͨ• ઃఆϑΝΠϧΛ༻ҙ͓͚ͯ͠ɺJobͰPresetΛࢦఆ͢Δ͚ͩͰɺҙͷύϥϝʔλͰ͍ΖΜͳը࣭ɾαΠζͷՌΛग़ͤΔΑ͏ʹ͔ͨͬͨ͠• TV༻ɺεϚϗ༻ɺPC༻ͱ͔…• Pipelineͷࣗಈੜ• Α͋͘ΔCIͷઃఆͷΑ͏ʹyamlʹPipelineͷॲཧΛఆ͍ٛͯͬͨ͠ΒίʔυΛࣗಈੜ͞ΕɺউखʹPipeline͕ग़དྷ্͕ΔΑ͏ʹ͔ͨͬͨ͠• Pipelineͷ࣮͕ංେԽͯ͠ؾʹͳΒͳ͍
ͨ͠ͱ͜Ζ 1ʢ࣌ؒ͋Εʁʣ• ʮલͷStepͷग़ྗΛɺ࣍ͷStepͷೖྗͱ͢ΔʯΛͲ͏ͬͯΔ͔ʁ• Sidekiq BatchͷCallbackͰҾ͖ճ͍ͯ͘͜͠ͱͰղܾɻ
ͨ͠ͱ͜Ζ 2ʢ࣌ؒ͋Εʁʣ• ffmpegίϚϯυͷೖग़ྗ༷͕ಛघ͗͢Δ• ͻͱͭͷϑΝΠϧΛInput͠ɺͻͱͭͷϑΝΠϧΛOutput͢Δ• ෳͷϑΝΠϧΛInput͠ɺͻͱͭͷϑΝΠϧΛOutput͢Δ• ͔͠ೖྗͷॱংॏཁ• CommandͷجఈΫϥεΛ࡞ͬͯநԽ• Pipeline → Step → Worker ͱɺෳͷInputΛॱংΛอͪͳ͕Β͍͍ײ͡ʹCommandʹ͢
·ͱΊ• εέʔϦϯάՄೳͳಈըฤू Microservice ΛSidekiq BatchΛ͍͍ͬͯײ͡ʹ࡞ͬͨ• Sidekiqͱͯྑ͍• Sidekiq Proͬͱྑ͍• Sidekiq BatchΛ͏͜ͱͰෳࡶͳύΠϓϥΠϯॲཧΛεέʔϧͰ͖Δ• ಈըॲཧҎ֎ʹɺूܭɾղੳͱ͔ɺෳࡶͳcron scriptͱ͔…• நతͳ͕ଟ͘ͳͬͯ͠·ͬͨͷͰɺৄࡉSidekiq BatchΛੋඇ͓ࢼ͍ͩ͘͠͞ʢ$950/yearʣ
·ͱΊ
THANK YOU!!