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이 있는 것 같기 때문에 참고까지 올려 둡니다
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이 있는 것 같기 때문에 참고까지 올려 둡니다
# On OSX
brew update
brew install redis
brew services start redis
gem에 sidekiq-failures을 추가하여 대시 보드에서 확인할 수 있으며 실패한 모든 큐를 다시 시도 할 수 있습니다.
gem 'sidekiq-failures'
failures 목록에서도 오류 세부 정보를 볼 수 있습니다.
그 밖에도 던져진 큐를 알고 & 분석하는 등으로 많은 gem이 있는 것 같기 때문에 참고까지 올려 둡니다
재시도 한도 설정
sidekiq는 확실히 디폴트로 25,6회 정도 리트라이를 하고 나서 큐를 죽인다고 하는 사양이 되어 있었을까 생각합니다.
그래서 많은 작업을 단번에 처리시킬 때 등, 거기까지 재 시도하지 않아도 좋기 때문에 안 되었던 몇 번인가 도전해 안 된다면 가르쳐・・・라고 하는 사람을 위해서, 재 시도의 상한을 job 파일에 나열됩니다.
app/jobs/your_job.rbclass 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.rbSidekiq.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 통지 되게 됩니다.
주의점
class YourJob < ActiveJob::Base
...
queue_as :default
sidekiq_options retry: 5
...
end
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 통지 되게 됩니다.
주의점
config.death_handlers에 알림을 설정하면 대시보드에서 수동으로 대기열을 죽이면 알림이 오지 않습니다. 그래서 리트라이 상한의 5회를 넘었을 경우에만 통지가 오게 됩니다.
예외 처리이므로 일단 작업을 처리하고 오류가되면 사망으로 간청되어 slack 통지는 해줍니다만 재 시도는 해주지 않습니다. 어떠한 사정으로 처리되지 않고 그래도 재시도하고 싶은 경우에는, 상기와 같이 config.death_handlers로 slack 통지의 설정을 추천합니다.
Reference
이 문제에 관하여(sidekiq의 재시도 상한을 설정하고 죽은 대기열을 슬랙으로 알리는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/chihirot0109/items/b540d5cf73162fc35e41텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)