sidekiq의 재시도 상한을 설정하고 죽은 대기열을 슬랙으로 알리는 방법

소개



비동기로 job을 처리해 주는 sidekiq 를 도입하는 가운데, 편의성을 살리면서도 자신의 앱 전용으로 커스터마이즈 하고 싶은, 그럴 때 유용한 설정을 정리하고 있습니다.

sidekiq란?



sidekiq는 비동기 처리를 가능하게 해주는 라이브러리입니다. 복수의 작업을 동시에 실행시킬 때 등에, 각 작업의 queue의 명칭을 나누는 것으로, 처리의 우선 순위를 지정할 수가 있습니다. 비슷한 라이브러리에 resque나 delayed_job 등이 있는지 생각합니다.
간단하게 도입할 수 있습니다만, 집착해 버린 큐를 디폴트로 25회인가 26회인가 재시도 하거나, 그 후에는 DEAD가 되어 실행하고 있던 큐의 로그를 볼 수 없다는 등의 귀찮은 점도 있습니다.
그래서 이 기사에서는, 예외를 던졌을 때 등에 언제까지나 재시도하지 않고 상한을 설정해 DEAD로 하고, 그 때에 slack에 큐의 내용과 에러 메세지를 던진다고 하는 설정을 하는 방법에 대해 이야기합니다.

환경



Ruby 2.6.6
Rails 6.0.2
sidekiq에는 redis가 필요합니다.
# On OSX
brew update
brew install redis
brew services start redis

실패한 대기열을 대시보드에서 확인



gem에 sidekiq-failures을 추가하여 대시 보드에서 확인할 수 있으며 실패한 모든 큐를 다시 시도 할 수 있습니다.
gem 'sidekiq-failures'



failures 목록에서도 오류 세부 정보를 볼 수 있습니다.


그 밖에도 던져진 큐를 알고 & 분석하는 등으로 많은 gem이 있는 것 같기 때문에 참고까지 올려 둡니다
  • utgarda/sidekiq-status
  • russ/sidekiq-history
  • davydovanton/sidekiq-statistic

  • 재시도 한도 설정



    sidekiq는 확실히 디폴트로 25,6회 정도 리트라이를 하고 나서 큐를 죽인다고 하는 사양이 되어 있었을까 생각합니다.
    그래서 많은 작업을 단번에 처리시킬 때 등, 거기까지 재 시도하지 않아도 좋기 때문에 안 되었던 몇 번인가 도전해 안 된다면 가르쳐・・・라고 하는 사람을 위해서, 재 시도의 상한을 job 파일에 나열됩니다.

    app/jobs/your_job.rb
    class YourJob < ActiveJob::Base
      ...
      queue_as :default
      sidekiq_options retry: 5
      ...
    end
    
    

    이것으로 5회 트라이하여 안 되었던 큐는 DEAD 큐가 됩니다.

    큐의 사망을 슬랙으로 통지



    Rails 앱에서 slack 알림을 매우 간단하게 해주는 gem이 slack-incoming-webhooks입니다.
    gem 'slack-incoming-webhooks'
    

    통지하는 채널의 URL 취득은 이 페이지 를 확인해 주세요.

    initializer로 큐가 사망했을 경우의 처리를 설정 (채널의 URL은 .env에 보존합니다)

    app/config/initializers/sidekiq.rb
    Sidekiq.configure_server do |config|
      config.death_handlers << ->(job, ex) do
        slack = Slack::Incoming::Webhooks.new(ENV['SLACK_WEBHOOK_URL'])
        attachments = [{
          title: "Sidekiq failure",
          text: "ONE DEAD JOB IS FOUND:\n (#{job['args']}) \n msg(#{job['error_message']})",
          color: "#fb2489"
        }]
        slack.post "", attachments: attachments
      end
    end
    

    이것으로 자연과 DEAD가 되어 버린 큐는 slack 통지 되게 됩니다.


    주의점


  • sidekiq 대시보드에서 대기열을 죽이면 알림이 오지 않음
    config.death_handlers에 알림을 설정하면 대시보드에서 수동으로 대기열을 죽이면 알림이 오지 않습니다. 그래서 리트라이 상한의 5회를 넘었을 경우에만 통지가 오게 됩니다.
  • rescure_from Exception으로 통지 설정하면 재 시도해 주지 않는다
    예외 처리이므로 일단 작업을 처리하고 오류가되면 사망으로 간청되어 slack 통지는 해줍니다만 재 시도는 해주지 않습니다. 어떠한 사정으로 처리되지 않고 그래도 재시도하고 싶은 경우에는, 상기와 같이 config.death_handlers로 slack 통지의 설정을 추천합니다.
  • 좋은 웹페이지 즐겨찾기