Настройка задержек повтора с помощью 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 часов.
Вы можете продолжать вызывать ChangeMessageVisibility, чтобы увеличить время ожидания видимости максимум до 12 часов. Если вы попытаетесь продлить срок более 12 часов, запрос будет отклонен.