🖥

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

に公開

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 を渡します。

https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-configure-visibility-timeout-queue.html

そうすると 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

https://github.com/YumaInaura/YumaInaura/issues/2619

チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ

Twitter

https://twitter.com/YumaInaura

公開日時

2019-10-22

Discussion