shoryukenはAWS SQS の可視性タイムアウトの仕組みを使ってリトライを実現していそうな気がした。
https://github.com/phstc/shoryuken/blob/master/lib/shoryuken/middleware/server/exponential_backoff_retry.rb#L54
sqs_msg.change_visibility(visibility_timeout: next_visibility_timeout(interval.to_i, started_at))
AWS SQSではキュー単位ではなく、メッセージ単位での可視性タイムアウト指定というのが出来て。この仕組を使ってるのかな。
複数メッセージの可視性タイムアウトを設定する (例: メッセージごとに異なるタイムアウト値を設定する) には、ArrayList を作成して、可視性タイムアウト (秒) を設定したメッセージを追加し、メッセージのキュー URL および ArrayList を渡します。
そうすると ActiveJobで retry を書いておけば shoryuken がその仕組みを使ってくれるため、特にAWS SQS のキュー設定を意識する必要はない気がした。
むしろAWS SQSの仕組みにのっとらない形でリトライを実現していたらびっくりするし、使い物にならないはずだよね。
class ShoryukenExampleRetryJob < ApplicationJob
queue_as :default
class SomeJobError < StandardError; end
retry_on SomeJobError, wait: 3.seconds, attempts: 3 do |job, exception|
# リトライが全て失敗した時の処理をここに書く
puts "SURRENDER!"
end
def perform(message)
puts "PERFORM! #{message}"
raise
rescue
raise SomeJobError.new('Watch out!')
end
end
Original by Github issue
チャットメンバー募集
何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。