LoginSignup
1
0

More than 1 year has passed since last update.

Ruby の shoryuken gem は AWS SQS のリトライ処理をどうやって実現しているのか? ( Rails ActiveJob の例 ) #AWS #Rails

Last updated at Posted at 2019-10-22

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オープンチャットもご利用ください。

Twitter

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0