Настройка задержек повтора с помощью Amazon SQS от Shoryuken (ruby)

Я перевожу сервис обработки фоновых заданий, созданный с помощью sidekiq, на shoryuken, основанный на Amazon SQS. С Sidekiq вы можете настроить шаблон повторов, используя sidekiq_retry_in:

class WorkerWithCustomRetry
    include Sidekiq::Worker
    sidekiq_options :retry => 5

    sidekiq_retry_in do |count|
        retry_count(count)
    end

    def self.retry_count(count)
    ...
    end
end

где, в моем случае, retry_count возвращает задержку для следующей попытки на основе внешней конфигурации. С помощью повторов shoryuken передаются SQS, которые обрабатывают повторы автоматически, пока сообщение пользователя не удаляется. Однако с помощью shoryuken вы можете изменить задержку, используя retry_intervals но документация только объясняет, как установить фиксированные значения:

class MyWorker
    include Shoryuken::Worker

    shoryuken_options queue: 'default', retry_intervals: [360, 1200, 3600] # 5.minutes, 20.minutes and 1.hour

end

Мне нужно настроить задержку для повторов так же, как с sidekiq, используя retry_count метод, который возвращает разные значения в зависимости от внешних данных. Возможно ли это или существует обходной путь для этого с помощью шорюкена?

1 ответ

Решение

В настоящее время Shoryuken поддерживает только фиксированные значения для экспоненциального отката, но вы можете отправить PR, изменяющий ExponentialBackoffRetry, с помощью:

# https://github.com/phstc/shoryuken/blob/290b1cb4c4c40f34881d7f7b7a3beda949099cf5/lib/shoryuken/middleware/server/exponential_backoff_retry.rb#L11

retry_intervals = worker.class.get_shoryuken_options['retry_intervals']

retry_intervals = if retry_intervals.respond_to? :call
                    retry_intervals.call(worker, queue, sqs_msg, body)
                  else
                    Array(retry_intervals)
                  end

Таким образом, вы сможете использовать proc или фиксированные значения для установки retry_intervalsт.е.

class MyWorker
  include Shoryuken::Worker

  shoryuken_options queue: 'default', 
    retry_intervals: -> (worker, queue, sqs_msg, body) { worker.your_method(...) }
end

ИЛИ вы можете удалить по умолчанию ExponentialBackoffRetry и добавьте свой:

Shoryuken.configure_server do |config|
  config.server_middleware do |chain|
    chain.remove Middleware::Server::ExponentialBackoffRetry
    chain.add YourExponentialBackoffRetry
  end
end

Но имейте в виду, что SQS официально не поддерживает экспоненциальный откат, это что-то реализованное в Shoryuken с использованием тайм-аута видимости, который может быть увеличен до 12 часов.

https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ChangeMessageVisibility.html

Вы можете продолжать вызывать ChangeMessageVisibility, чтобы увеличить время ожидания видимости максимум до 12 часов. Если вы попытаетесь продлить срок более 12 часов, запрос будет отклонен.

Другие вопросы по тегам