Upgrade to Pro — share decks privately, control downloads, hide ads and more …

非同期処理実行基盤 Delayed脱出 → Solid Queue完全移行への旅路。

非同期処理実行基盤 Delayed脱出 → Solid Queue完全移行への旅路。

Kaigi on Rails 2025で登壇で作成した資料です。
会社の非同期処理の基盤をDelayedからSolid Queueにした話をもろもろ書きました。

Avatar for Shohei Kobayashi

Shohei Kobayashi

September 27, 2025
Tweet

More Decks by Shohei Kobayashi

Other Decks in Technology

Transcript

  1. ՝୊ͱ΍Γ͍ͨ͜ͱ ύϑΥʔϚϯεͱεέʔϥϏϦςΟͷ޲্ ॊೈͳδϣϒ؅ཧͱ༏ઌ੍ޚ ։ൃͱӡ༻ͷޮ཰Խ ⬜ ៉ྷʹઢܗʹεέʔϧΞ΢τͰ͖ΔΑ͏ʹ͍ͨ͠ ⬜ ॲཧͰ͖Δδϣϒͷ਺Λ૿΍͍ͨ͠ ⬜ ϦιʔεΛ༗ޮ׆༻͍ͨ͠

    ⬜ ༏ઌ౓Λఆٛͨ͠Β༏ઌ౓Λकͬͯ΄͍͠ ⬜ δϣϒ͝ͱʹΩϡʔͱ8PSLFSΛ෼͚͍ͨ ⬜ ఆظ࣮ߦॲཧΛ·ͱΊ͍ͨ ⬜ "DUJWF+PCʹҠߦ͍ͨ͠ʢ%FMBZFEઐ༻ͷॻ͖ํͱ"DUJWF+PCͷࠞࡏഇࢭʣ
  2. ՝୊ͱ΍Γ͍ͨ͜ͱ ύϑΥʔϚϯεͱεέʔϥϏϦςΟͷ޲্ ॊೈͳδϣϒ؅ཧͱ༏ઌ੍ޚ ։ൃͱӡ༻ͷޮ཰Խ ⬜ ៉ྷʹઢܗʹεέʔϧΞ΢τͰ͖ΔΑ͏ʹ͍ͨ͠ ⬜ ॲཧͰ͖Δδϣϒͷ਺Λ૿΍͍ͨ͠ ⬜ ϦιʔεΛ༗ޮ׆༻͍ͨ͠

    ⬜ ༏ઌ౓Λఆٛͨ͠Β༏ઌ౓Λकͬͯ΄͍͠ ⬜ δϣϒ͝ͱʹΩϡʔͱ8PSLFSΛ෼͚͍ͨ ⬜ ఆظ࣮ߦॲཧΛ·ͱΊ͍ͨ ⬜ "DUJWF+PCʹҠߦ͍ͨ͠ʢ%FMBZFEઐ༻ͷॻ͖ํͱ"DUJWF+PCͷࠞࡏഇࢭʣ ⬜ Ͱ͖Δ͚ͩ3BJMT8BZʹ৐͍ͤͨ
  3. ՝୊ͱ΍Γ͍ͨ͜ͱ ύϑΥʔϚϯεͱεέʔϥϏϦςΟͷ޲্ ॊೈͳδϣϒ؅ཧͱ༏ઌ੍ޚ ։ൃͱӡ༻ͷޮ཰Խ ⬜ ៉ྷʹઢܗʹεέʔϧΞ΢τͰ͖ΔΑ͏ʹ͍ͨ͠ ⬜ ॲཧͰ͖Δδϣϒͷ਺Λ૿΍͍ͨ͠ ⬜ ϦιʔεΛ༗ޮ׆༻͍ͨ͠

    ⬜ ༏ઌ౓Λఆٛͨ͠Β༏ઌ౓Λकͬͯ΄͍͠ ⬜ δϣϒ͝ͱʹΩϡʔͱ8PSLFSΛ෼͚͍ͨ ⬜ ఆظ࣮ߦॲཧΛ·ͱΊ͍ͨ ⬜ "DUJWF+PCʹҠߦ͍ͨ͠ʢ%FMBZFEઐ༻ͷॻ͖ํͱ"DUJWF+PCͷࠞࡏഇࢭʣ ⬜ Ͱ͖Δ͚ͩ3BJMT8BZʹ৐͍ͤͨ
  4. +PC" Worker A Worker B +PC# +PC$ ઢܗతͳεέʔϧΞ΢τෆՄೳ໰୊ +PC5BCMF 45"3553"/4"$5*0/

    4&-&$5 '30.+0#48)&3&QSPDFTTFEOP'0361%"5&-*.*5 YYYYY $0..*5 ʮۭ͍ͯΔδϣϒΛͭϩοΫͯ͠ɺԶʹ͘Εʂʯ ʮۭ͍ͯΔδϣϒΛͭϩοΫͯ͠ɺԶʹ͘Εʂʯ
  5. +PC" Worker A Worker B +PC# +PC$ ઢܗతͳεέʔϧΞ΢τෆՄೳ໰୊ +PC5BCMF 45"3553"/4"$5*0/

    4&-&$5 '30.+0#48)&3&QSPDFTTFEOP'0361%"5&-*.*5 YYYYY $0..*5 ʮۭ͍ͯΔδϣϒΛͭϩοΫͯ͠ɺԶʹ͘Εʂʯ ʮϩοΫ͞ΕͯΔ͔Βɺ଴͔ͭʜʜʯ ʮۭ͍ͯΔδϣϒΛͭϩοΫͯ͠ɺԶʹ͘Εʂʯ
  6. +PC" Worker A Worker B +PC# +PC$ ઢܗతͳεέʔϧΞ΢τෆՄೳ໰୊ +PC5BCMF 45"3553"/4"$5*0/

    4&-&$5 '30.+0#48)&3&QSPDFTTFEOP'0361%"5&-*.*5 YYYYY $0..*5 ʮۭ͍ͯΔδϣϒΛͭϩοΫͯ͠ɺԶʹ͘Εʂʯ ʮϩοΫ͞ΕͯΔ͔Βɺ଴͔ͭʜʜʯ ʮۭ͍ͯΔδϣϒΛͭϩοΫͯ͠ɺԶʹ͘Εʂʯ 5SBOTBDUJPO͕DPNNJU͞ΕΔ·Ͱ+PC#ΛͱΓʹ͍͔ͣɺ଴ͪXPSLFSʹͳΔ
  7. +PC" Worker A Worker B +PC# +PC$ ઢܗతͳεέʔϧΞ΢τෆՄೳ໰୊ +PC5BCMF 45"3553"/4"$5*0/

    4&-&$5 '30.+0#48)&3&QSPDFTTFEOP'0361%"5&-*.*5 YYYYY $0..*5 ʮۭ͍ͯΔδϣϒΛͭϩοΫͯ͠ɺԶʹ͘Εʂʯ ʮϩοΫ͞ΕͯΔ͔Βɺ଴͔ͭʜʜʯ ʮۭ͍ͯΔδϣϒΛͭϩοΫͯ͠ɺԶʹ͘Εʂʯ 5SBOTBDUJPO͕DPNNJU͞ΕΔ·Ͱ+PC#ΛͱΓʹ͍͔ͣɺ଴ͪXPSLFSʹͳΔ 8PSLFSΛ૿΍ͯ͠΋ɺδϣϒͷॲཧ଎౓͕៉ྷʹഒʹͳͬͯ͘Εͳ͍
  8. ൺֱ؍఺ͷҰྫ ⬜ ༻్ʹԠͯ͡ෳ਺ͷΩϡʔ؅ཧ͕Ͱ͖Δ͜ͱ ⬜ ৽͍͠"84Ϧιʔε͕ෆཁ ⬜ ઢܗεέʔϧΞ΢τՄೳ ⬜ %#ϩοΫͰύϑΥʔϚϯεྼԽ͠ͳ͍ ⬜

    3BJMTͱͷ਌࿨ੑ ⬜ ఆظ࣮ߦॲཧج൫͕͋Δ ⬜ ⬜ ແ՝ۚͰ࢖͍͍ͨ δϣϒͷτϥϯβΫγϣϯ಺ݺͼग़͠ରԠ
  9. Sidekiq Proͷ͍͍ͱ͜Ζ ✅ δϣϒ͕ࣦഊͯ͠΋৺഑ෆཁʂ ✅ ࠷ڧͷεέδϡʔϦϯάػೳ ✅ ΊͬͪΌڧྗ#BUDIFTػೳ ͨ͘͞Μͷδϣϒ·ͱΊ࣮ߦͰɺେྔσʔλ΋҆શɾ҆৺ॲཧ ෳ਺ͷδϣϒΛҰͭͷτϥϯβΫγϣϯͱͯ͠ѻ͑Δ+PC'BJMVSFT

    δϣϒ͕ࣦഊͨ࣌͠ʹࣗಈతʹϦτϥΠ͢Δ3FMJBCMF2VFVFT ࣦഊͯ͠΋҆৺ઃܭͩͥʂ δϣϒͷ࣮ߦॱংΛࡉ੍͔͘ޚͰ͖Δ6OJRVF+PCT ಛఆͷ࣌ؒ·Ͱδϣϒͷ࣮ߦΛ஗ΒͤΔ4DIFEVMFE+PCT
  10. +PC" Worker A Worker B +PC# +PC$ 4PMJE2VFVFͰղܾ͢ΔઢܗεέʔϧΞ΢τ +PC5BCMF ʮۭ͍ͯΔδϣϒΛͭϩοΫͯ͠ɺԶʹ͘Εʂʯ

    45"3553"/4"$5*0/ 4&-&$5 '30.KPCT@UBCMF'0361%"5&4,*1-0$,&%-*.*5  $0..*5
  11. +PC" Worker A Worker B +PC# +PC$ 4PMJE2VFVFͰղܾ͢ΔઢܗεέʔϧΞ΢τ +PC5BCMF ʮۭ͍ͯΔδϣϒΛͭϩοΫͯ͠ɺԶʹ͘Εʂʯ

    45"3553"/4"$5*0/ 4&-&$5 '30.KPCT@UBCMF'0361%"5&4,*1-0$,&%-*.*5  $0..*5
  12. +PC" Worker A Worker B +PC# +PC$ 4PMJE2VFVFͰղܾ͢ΔઢܗεέʔϧΞ΢τ +PC5BCMF ʮۭ͍ͯΔδϣϒΛͭϩοΫͯ͠ɺԶʹ͘Εʂʯ

    ʮۭ͍ͯΔδϣϒΛͭϩοΫͯ͠ɺԶʹ͘Εʂ ͨͩ͠ɺ୭͔͕ϩοΫ͍ͯ͠ΔδϣϒͳΒແࢹ͍͍ͯͥ͠ʂʯ 45"3553"/4"$5*0/ 4&-&$5 '30.KPCT@UBCMF'0361%"5&4,*1-0$,&%-*.*5  $0..*5
  13. TestClass.delay.send_mail( user_id: user.id) ".delay" Method Pros •γϯϓϧͰ෼͔Γ΍͍͢ɺ௚ײత •ActiveRecordͷϞσϧͱ૬ੑ͕ྑ͍ Cons •Ωϡʔࢦఆ͕ෆՄ

    •༏ઌ౓Λࡉ͔͘ࢦఆ͕೉͍͠ •%FMBZFEʹґଘͨ͠ॻ͖ํʹͳͬͯ͠·͏ Delayedからのがれられない……
  14. ActiveJobͰ໌ࣔతʹDelayedࢦఆ class TestClassJob < ApplicationJob self.queue_adapter = :delayed queue_as :mail

    def perform(user_id:) # ~~~~~ end end TestClass.delay.send_mail( user_id: user.id )
  15. ActiveJobͰ໌ࣔతʹDelayedࢦఆ class TestClassJob < ApplicationJob self.queue_adapter = :delayed queue_as :mail

    def perform(user_id:) # ~~~~~ end end TestClass.delay.send_mail( user_id: user.id )
  16. ActiveJobͰ໌ࣔతʹDelayedࢦఆ class TestClassJob < ApplicationJob self.queue_adapter = :delayed queue_as :mail

    def perform(user_id:) # ~~~~~ end end 4PMJE2VFVFΛJOTUBMMͯ͠΋%FMBZFEͰಈ࡞ TestClass.delay.send_mail( user_id: user.id )
  17. ActiveJobͰ໌ࣔతʹDelayedࢦఆ class TestClassJob < ApplicationJob self.queue_adapter = :delayed queue_as :mail

    def perform(user_id:) # ~~~~~ end end 4PMJE2VFVFΛJOTUBMMͯ͠΋%FMBZFEͰಈ࡞ Ҡߦத4PMJE2VFVFؔ࿈ͷ13ΛϚʔδͯ͠΋ ՔಇதγεςϜʹ͸Өڹͳ͠ʂ TestClass.delay.send_mail( user_id: user.id )
  18. Solid Queue Con fi guration production: dispatchers: - polling_interval: 1

    batch_size: 500 workers: - queues: "default" threads: 2 processes: 5 polling_interval: 5 - queues: "mail" threads: 2 processes: 5 polling_interval: 1 config/solid_queue/queue_config.yml Dispatcher TPMJE@RVFVF@KPCT TPMJE@RVFVF@SFBEZ@FYFDVUJPOT worker:default worker: mail
  19. Solid Queue Con fi guration production: dispatchers: - polling_interval: 1

    batch_size: 500 workers: - queues: "default" threads: 2 processes: 5 polling_interval: 5 - queues: "mail" threads: 2 processes: 5 polling_interval: 1 config/solid_queue/queue_config.yml Dispatcher TPMJE@RVFVF@KPCT TPMJE@RVFVF@SFBEZ@FYFDVUJPOT worker:default worker: mail
  20. Solid Queue Con fi guration production: dispatchers: - polling_interval: 1

    batch_size: 500 workers: - queues: "default" threads: 2 processes: 5 polling_interval: 5 - queues: "mail" threads: 2 processes: 5 polling_interval: 1 config/solid_queue/queue_config.yml Dispatcher TPMJE@RVFVF@KPCT TPMJE@RVFVF@SFBEZ@FYFDVUJPOT worker:default worker: mail
  21. Solid Queue Con fi guration production: dispatchers: - polling_interval: 1

    batch_size: 500 workers: - queues: "default" threads: 2 processes: 5 polling_interval: 5 - queues: "mail" threads: 2 processes: 5 polling_interval: 1 config/solid_queue/queue_config.yml Dispatcher TPMJE@RVFVF@KPCT TPMJE@RVFVF@SFBEZ@FYFDVUJPOT worker:default worker: mail
  22. Solid Queue Con fi guration:2 production: dispatchers: - polling_interval: 1

    batch_size: 500 workers: - queues: "default" threads: 2 processes: 5 polling_interval: 5 - queues: "mail" threads: 2 processes: 5 polling_interval: 1 config/solid_queue/queue_config.yml
  23. Solid Queue Con fi guration:2 ௨ৗͷδϣϒ production: dispatchers: - polling_interval:

    1 batch_size: 500 workers: - queues: "default" threads: 2 processes: 5 polling_interval: 5 - queues: "mail" threads: 2 processes: 5 polling_interval: 1 config/solid_queue/queue_config.yml
  24. Solid Queue Con fi guration:2 ௨ৗͷδϣϒ ϝʔϧૹ৴༻ production: dispatchers: -

    polling_interval: 1 batch_size: 500 workers: - queues: "default" threads: 2 processes: 5 polling_interval: 5 - queues: "mail" threads: 2 processes: 5 polling_interval: 1 config/solid_queue/queue_config.yml
  25. con fi g.solid_queue.use_skip_locked = true con fi g.solid_queue.shutdown_timeout = 600.seconds

    con fi g.solid_queue.silence_polling = true con fi g.solid_queue.preserve_ fi nished_jobs = false Solid Queue Configuration3 con fi g/initializers/solid_queue.rb
  26. con fi g.solid_queue.use_skip_locked = true con fi g.solid_queue.shutdown_timeout = 600.seconds

    con fi g.solid_queue.silence_polling = true con fi g.solid_queue.preserve_ fi nished_jobs = false Solid Queue Configuration3 61%"5&4,*1-0$,&%Λ࢖͏ con fi g/initializers/solid_queue.rb
  27. con fi g.solid_queue.use_skip_locked = true con fi g.solid_queue.shutdown_timeout = 600.seconds

    con fi g.solid_queue.silence_polling = true con fi g.solid_queue.preserve_ fi nished_jobs = false Solid Queue Configuration3 61%"5&4,*1-0$,&%Λ࢖͏ ϓϩηεʹ5&3.γάφϧૹ৴ޙϓϩηεऴྃ·Ͱͷ࣌ؒʢ෼ʣ con fi g/initializers/solid_queue.rb
  28. con fi g.solid_queue.use_skip_locked = true con fi g.solid_queue.shutdown_timeout = 600.seconds

    con fi g.solid_queue.silence_polling = true con fi g.solid_queue.preserve_ fi nished_jobs = false Solid Queue Configuration3 61%"5&4,*1-0$,&%Λ࢖͏ ϓϩηεʹ5&3.γάφϧૹ৴ޙϓϩηεऴྃ·Ͱͷ࣌ؒʢ෼ʣ ϫʔΧʔͱσΟεύονϟΛϙʔϦϯά͢Δͱ͖ͷ"DUJWF3FDPSEϩάΛ཈੍͢Δ con fi g/initializers/solid_queue.rb
  29. con fi g.solid_queue.use_skip_locked = true con fi g.solid_queue.shutdown_timeout = 600.seconds

    con fi g.solid_queue.silence_polling = true con fi g.solid_queue.preserve_ fi nished_jobs = false Solid Queue Configuration3 61%"5&4,*1-0$,&%Λ࢖͏ ϓϩηεʹ5&3.γάφϧૹ৴ޙϓϩηεऴྃ·Ͱͷ࣌ؒʢ෼ʣ ϫʔΧʔͱσΟεύονϟΛϙʔϦϯά͢Δͱ͖ͷ"DUJWF3FDPSEϩάΛ཈੍͢Δ ׬ྃͨ͠δϣϒΛςʔϒϧʹ࢒͞ͳ͍ con fi g/initializers/solid_queue.rb
  30. ؂ࢹ͢Δͧʂ EFMBZFEฤ • delayed.job.count - δϣϒͷ૯਺ • delayed.job.future_count -ະདྷʹ࣮ߦ͞ΕΔδϣϒͷ਺ •

    delayed.job.working_count - ݱࡏॲཧதͷδϣϒ਺ • delayed.job.workable_count - ॲཧ଴ͪͷδϣϒ • delayed.job.erroring_count - ࣮ߦʹࣦഊͨ͠δϣϒʢࣦഊճ਺͕ճҎ্ʣ • delayed.job.failed_count - ࠷ऴతʹࣦഊͨ͠δϣϒʢ΋͏ϦτϥΠͰ͖ͳ͍ʣ • delayed.job.max_lock_age - ͣͬͱϩοΫ͞Εଓ͚͍ͯΔδϣϒ • delayed.job.max_age - ࠷΋ݹ͍δϣϒͷܦա࣌ؒ • %FMBZFEͷػೳͱͯ͠ ఏڙ͞ΕͯΔΜͩͥʂ
  31. ؂ࢹ͢Δͧʂ 4PMJE2VFVFฤ • job.count - δϣϒͷ૯਺ • job.future_count -ະདྷʹ࣮ߦ͞ΕΔδϣϒͷ਺ •

    job.working_count - ݱࡏॲཧதͷδϣϒ਺ • job.workable_count - ॲཧ଴ͪͷδϣϒ • job.erroring_count - ࣮ߦʹࣦഊͨ͠δϣϒʢࣦഊճ਺͕ճҎ্ʣ • job.failed_count - ࠷ऴతʹࣦഊͨ͠δϣϒʢ΋͏ϦτϥΠͰ͖ͳ͍ʣ • job.max_lock_age - ͣͬͱϩοΫ͞Εଓ͚͍ͯΔδϣϒ • job.max_age - ࠷΋ݹ͍δϣϒͷܦա࣌ؒ •
  32. ؂ࢹ͢Δͧʂ 4PMJE2VFVFฤ • job.count - δϣϒͷ૯਺ • job.future_count -ະདྷʹ࣮ߦ͞ΕΔδϣϒͷ਺ •

    job.working_count - ݱࡏॲཧதͷδϣϒ਺ • job.workable_count - ॲཧ଴ͪͷδϣϒ • job.erroring_count - ࣮ߦʹࣦഊͨ͠δϣϒʢࣦഊճ਺͕ճҎ্ʣ • job.failed_count - ࠷ऴతʹࣦഊͨ͠δϣϒʢ΋͏ϦτϥΠͰ͖ͳ͍ʣ • job.max_lock_age - ͣͬͱϩοΫ͞Εଓ͚͍ͯΔδϣϒ • job.max_age - ࠷΋ݹ͍δϣϒͷܦա࣌ؒ • 4PMJE2VFVFͷػೳͱͯ͠ ఏڙ͞Ε͍ͯͳ͍ͥʂ
  33. ϝτϦΫε໊ ղઆ future_count কདྷ࣮ߦ͞ΕΔδϣϒͷ਺ɻಛఆͷ࣌ࠁʹ࣮ߦ͕εέδϡ ʔϧ͞Ε͍ͯΔδϣϒͷ߹ܭ workable_count ॲཧ଴ͪͷδϣϒͷ਺ɻϫʔΧʔʹ͍ͭͰ΋࣮ߦͯ͠΋Β ͑Δঢ়ଶͷδϣϒͷ߹ܭ working_count ݱࡏॲཧதͷδϣϒͷ਺ɻϫʔΧʔ͕ࠓ·͞ʹಈ͔͍ͯ͠

    Δδϣϒͷ߹ܭ retry_count ࠶࣮ߦΛ଴͍ͬͯΔδϣϒͷ਺ɻҰ౓ࣦഊͯ͠ɺϦτϥΠ ॲཧ͕ઃఆ͞Ε͍ͯΔδϣϒͷ߹ܭ ؂ࢹ͢Δͧʂ 4PMJE2VFVFฤ ϝτϦΫε໊ ղઆ throughput_rate ௚ۙ෼ؒʹॲཧ͕׬ྃͨ͠δϣϒͷ਺ max_age ࠷௕଴ػ࣌ؒɻ࠷΋௕͘଴͍ͬͯΔδϣϒͷܦա࣌ؒ median_wait_time ଴ػ࣌ؒͷதԝ஋ max_lock_age ࠷௕࣮ߦɻ average_lock_age ฏۉ࣮ߦ࣌ؒɻ࣮ߦதͷδϣϒͷฏۉతͳॲཧ࣌ؒ Ωϡʔͷঢ়ଶϝτϦΫε ύϑΥʔϚϯεϝτϦΫε
  34. ϝτϦΫε໊ ղઆ future_count কདྷ࣮ߦ͞ΕΔδϣϒͷ਺ɻಛఆͷ࣌ࠁʹ࣮ߦ͕εέδϡ ʔϧ͞Ε͍ͯΔδϣϒͷ߹ܭ workable_count ॲཧ଴ͪͷδϣϒͷ਺ɻϫʔΧʔʹ͍ͭͰ΋࣮ߦͯ͠΋Β ͑Δঢ়ଶͷδϣϒͷ߹ܭ working_count ݱࡏॲཧதͷδϣϒͷ਺ɻϫʔΧʔ͕ࠓ·͞ʹಈ͔͍ͯ͠

    Δδϣϒͷ߹ܭ retry_count ࠶࣮ߦΛ଴͍ͬͯΔδϣϒͷ਺ɻҰ౓ࣦഊͯ͠ɺϦτϥΠ ॲཧ͕ઃఆ͞Ε͍ͯΔδϣϒͷ߹ܭ ؂ࢹ͢Δͧʂ 4PMJE2VFVFฤ ϝτϦΫε໊ ղઆ throughput_rate ௚ۙ෼ؒʹॲཧ͕׬ྃͨ͠δϣϒͷ਺ max_age ࠷௕଴ػ࣌ؒɻ࠷΋௕͘଴͍ͬͯΔδϣϒͷܦա࣌ؒ median_wait_time ଴ػ࣌ؒͷதԝ஋ max_lock_age ࠷௕࣮ߦɻ average_lock_age ฏۉ࣮ߦ࣌ؒɻ࣮ߦதͷδϣϒͷฏۉతͳॲཧ࣌ؒ Ωϡʔͷঢ়ଶϝτϦΫε ύϑΥʔϚϯεϝτϦΫε ϝτϦΫε໊ ղઆ erroring_count Τϥʔ෇͖Ͱࣦഊͨ͠δϣϒͷ਺ɻΤϥʔϝοηʔδ͕෇͍͍ͯΔ ࣦഊδϣϒͷ߹ܭɻ failed_count ௚ۙ1࣌ؒͰࣦഊͨ͠δϣϒͷ૯਺ɻΤϥʔͷ༗ແΛ໰Θͣɺࣦഊ͠ ͨδϣϒͷ߹ܭɻ stale_jobs_count ఀ଺͍ͯ͠Δδϣϒͷ਺ɻ௕࣌ؒʢ1࣌ؒҎ্ʣ࣮ߦதͷδϣϒͰɺ σουϩοΫ΍ແݶϧʔϓͷՄೳੑɻ error_rate Τϥʔ཰ɻ௚ۙ1࣌ؒͷશδϣϒͷ͏ͪɺΤϥʔͰࣦഊׂͨ͠߹ɻ worker_utilization ϫʔΧʔͷ࢖༻཰ɻׂΓ౰ͯΒΕͨϫʔΧʔ͕ͲΕ͚ͩಇ͍͍ͯΔ ͔ͷׂ߹ɻ alert_age_percent Ξϥʔτᮢ஋ൺ཰ͩɻ༏ઌ౓Λߟྀͨ͠଴ػ͕࣌ؒɺࣄલʹઃఆ͠ ͨᮢ஋ʹͲΕ͚͍͍ͩۙͮͯΔ͔Λׂࣔ͢߹ɻ ΤϥʔΞϥʔτϝτϦΫε
  35. Delayed -> SolidQueue! class TestClassJob < ApplicationJob self.queue_adapter = :delayed

    queue_as :mail def perform(user_id:) # ~~~~~ end end class TestClassJob < ApplicationJob self.queue_adapter = :solid_queue queue_as :mail def perform(user_id:) # ~~~~~ end end
  36. Delayed -> SolidQueue! EFMBZFETPMJE@RVFVFʹมߋʂ class TestClassJob < ApplicationJob self.queue_adapter =

    :delayed queue_as :mail def perform(user_id:) # ~~~~~ end end class TestClassJob < ApplicationJob self.queue_adapter = :solid_queue queue_as :mail def perform(user_id:) # ~~~~~ end end
  37. Delayed -> SolidQueue! EFMBZFETPMJE@RVFVFʹมߋʂ Y+PCT$PVOU class TestClassJob < ApplicationJob self.queue_adapter

    = :delayed queue_as :mail def perform(user_id:) # ~~~~~ end end class TestClassJob < ApplicationJob self.queue_adapter = :solid_queue queue_as :mail def perform(user_id:) # ~~~~~ end end
  38. ActiveRecord::Base.transaction do user = User.create!(name: "৽͍͠Ϣʔβʔ") WelcomeEmailJob.perform_later(user.id) raise "Something went

    wrong!" end τϥϯβΫγϣϯ಺෦ʹॻ͔Εͨδϣϒ໰୊ ϢʔβΛ%#ʹอଘʢະίϛοτʣ
  39. ActiveRecord::Base.transaction do user = User.create!(name: "৽͍͠Ϣʔβʔ") WelcomeEmailJob.perform_later(user.id) raise "Something went

    wrong!" end τϥϯβΫγϣϯ಺෦ʹॻ͔Εͨδϣϒ໰୊ ϢʔβΛ%#ʹอଘʢະίϛοτʣ δϣϒΛΩϡʔʹೖΕΔ
  40. ActiveRecord::Base.transaction do user = User.create!(name: "৽͍͠Ϣʔβʔ") WelcomeEmailJob.perform_later(user.id) raise "Something went

    wrong!" end τϥϯβΫγϣϯ಺෦ʹॻ͔Εͨδϣϒ໰୊ ϢʔβΛ%#ʹอଘʢະίϛοτʣ δϣϒΛΩϡʔʹೖΕΔ δϣϒ͸Ϣʔβ͕࡞੒ࡁΈલఏͰ࣮ߦ
  41. ActiveRecord::Base.transaction do user = User.create!(name: "৽͍͠Ϣʔβʔ") WelcomeEmailJob.perform_later(user.id) raise "Something went

    wrong!" end τϥϯβΫγϣϯ಺෦ʹॻ͔Εͨδϣϒ໰୊ ϢʔβΛ%#ʹอଘʢະίϛοτʣ δϣϒΛΩϡʔʹೖΕΔ δϣϒ͸Ϣʔβ͕࡞੒ࡁΈલఏͰ࣮ߦ ݺͼग़͠ݩϝιουͰྫ֎ൃੜ
  42. ActiveRecord::Base.transaction do user = User.create!(name: "৽͍͠Ϣʔβʔ") WelcomeEmailJob.perform_later(user.id) raise "Something went

    wrong!" end τϥϯβΫγϣϯ಺෦ʹॻ͔Εͨδϣϒ໰୊ ϢʔβΛ%#ʹอଘʢະίϛοτʣ δϣϒΛΩϡʔʹೖΕΔ δϣϒ͸Ϣʔβ͕࡞੒ࡁΈલఏͰ࣮ߦ ݺͼग़͠ݩϝιουͰྫ֎ൃੜ VTFS͕ͳ͍ͷʹ ॲཧ࣮ߦ͞ΕΔʂʂ
  43. 8FC1PE 4PMJE2VFVF .BJO main DB Queue DB EKS τϥϯβΫγϣϯ಺෦ʹॻ͔Εͨδϣϒ໰୊ 8FCʹΞΫηε͕͋Δ

    τϥϯβΫγϣϯ։࢝ ॲཧͷ%#อଘॲཧʢະίϛοτʣ Ωϡʔ%#ʹΩϡʔ͕͸͍Δ
  44. 8FC1PE 4PMJE2VFVF .BJO main DB Queue DB EKS τϥϯβΫγϣϯ಺෦ʹॻ͔Εͨδϣϒ໰୊ 8FCʹΞΫηε͕͋Δ

    τϥϯβΫγϣϯ։࢝ ॲཧͷ%#อଘॲཧʢະίϛοτʣ Ωϡʔ%#ʹΩϡʔ͕͸͍Δ 8PSLFS͕औಘʹߦ͘
  45. 8FC1PE 4PMJE2VFVF .BJO main DB Queue DB EKS τϥϯβΫγϣϯ಺෦ʹॻ͔Εͨδϣϒ໰୊ 8FCʹΞΫηε͕͋Δ

    τϥϯβΫγϣϯ։࢝ ॲཧͷ%#อଘॲཧʢະίϛοτʣ Ωϡʔ%#ʹΩϡʔ͕͸͍Δ NBJO%#ͷίϛοτঢ়گ͸2VFVF%#͸஌ͬͨ͜ͱͰ͸ͳ͍ 8PSLFS͕औಘʹߦ͘
  46. 8FC1PE 4PMJE2VFVF .BJO main DB Queue DB EKS τϥϯβΫγϣϯ಺෦ʹॻ͔Εͨδϣϒ໰୊ 8FCʹΞΫηε͕͋Δ

    τϥϯβΫγϣϯ։࢝ ॲཧͷ%#อଘॲཧʢະίϛοτʣ Ωϡʔ%#ʹΩϡʔ͕͸͍Δ NBJO%#ͷίϛοτঢ়گ͸2VFVF%#͸஌ͬͨ͜ͱͰ͸ͳ͍ 8PSLFS͕औಘʹߦ͘ ίϛοτલʹδϣϒ͕࣮ߦ͞ΕΔ
  47. ActiveRecord::Base.transaction do user = User.create!(name: "৽͍͠Ϣʔβʔ") WelcomeEmailJob.perform_later(user.id) raise "Something went

    wrong!" end ղܾ๏τϥϯβΫγϣϯ಺෦ʹॻ͔Εͨδϣϒ໰୊ FORVFVF@BGUFS@USBOTBDUJPO@DPNNJUΛ࢖͑ΔΑ͏ʹ͢Δʂ
  48. ActiveRecord::Base.transaction do user = User.create!(name: "৽͍͠Ϣʔβʔ") WelcomeEmailJob.perform_later(user.id) raise "Something went

    wrong!" end ղܾ๏τϥϯβΫγϣϯ಺෦ʹॻ͔Εͨδϣϒ໰୊ ϢʔβΛ%#ʹอଘʢະίϛοτʣ FORVFVF@BGUFS@USBOTBDUJPO@DPNNJUΛ࢖͑ΔΑ͏ʹ͢Δʂ
  49. ActiveRecord::Base.transaction do user = User.create!(name: "৽͍͠Ϣʔβʔ") WelcomeEmailJob.perform_later(user.id) raise "Something went

    wrong!" end ղܾ๏τϥϯβΫγϣϯ಺෦ʹॻ͔Εͨδϣϒ໰୊ ϢʔβΛ%#ʹอଘʢະίϛοτʣ ඇಉظॲཧ͕Α͹ΕΔ ʢΤϯΩϡʔ͞Εͳ͍ʣ FORVFVF@BGUFS@USBOTBDUJPO@DPNNJUΛ࢖͑ΔΑ͏ʹ͢Δʂ
  50. ActiveRecord::Base.transaction do user = User.create!(name: "৽͍͠Ϣʔβʔ") WelcomeEmailJob.perform_later(user.id) raise "Something went

    wrong!" end ղܾ๏τϥϯβΫγϣϯ಺෦ʹॻ͔Εͨδϣϒ໰୊ ϢʔβΛ%#ʹอଘʢະίϛοτʣ ඇಉظॲཧ͕Α͹ΕΔ ʢΤϯΩϡʔ͞Εͳ͍ʣ FORVFVF@BGUFS@USBOTBDUJPO@DPNNJUΛ࢖͑ΔΑ͏ʹ͢Δʂ ݺͼग़͠ݩϝιουͰྫ֎ൃੜ
  51. ActiveRecord::Base.transaction do user = User.create!(name: "৽͍͠Ϣʔβʔ") WelcomeEmailJob.perform_later(user.id) raise "Something went

    wrong!" end ղܾ๏τϥϯβΫγϣϯ಺෦ʹॻ͔Εͨδϣϒ໰୊ ϢʔβΛ%#ʹอଘʢະίϛοτʣ ඇಉظॲཧ͕Α͹ΕΔ ʢΤϯΩϡʔ͞Εͳ͍ʣ FORVFVF@BGUFS@USBOTBDUJPO@DPNNJUΛ࢖͑ΔΑ͏ʹ͢Δʂ Ϣʔβ͸อଘ͞Εͳ͍ ʢ%#ʹίϛοτ͞Εͳ͍ʣ ݺͼग़͠ݩϝιουͰྫ֎ൃੜ
  52. ActiveRecord::Base.transaction do user = User.create!(name: "৽͍͠Ϣʔβʔ") WelcomeEmailJob.perform_later(user.id) raise "Something went

    wrong!" end ղܾ๏τϥϯβΫγϣϯ಺෦ʹॻ͔Εͨδϣϒ໰୊ ϢʔβΛ%#ʹอଘʢະίϛοτʣ ඇಉظॲཧ͕Α͹ΕΔ ʢΤϯΩϡʔ͞Εͳ͍ʣ FORVFVF@BGUFS@USBOTBDUJPO@DPNNJUΛ࢖͑ΔΑ͏ʹ͢Δʂ Ϣʔβ͸อଘ͞Εͳ͍ ʢ%#ʹίϛοτ͞Εͳ͍ʣ ੒ޭ͠ͳ͔ͬͨͷͰ ࠷ऴతʹ΋ΤϯΩϡʔ͞Εͳ͍ʂ ݺͼग़͠ݩϝιουͰྫ֎ൃੜ