我正在将使用塞德基创建的后台作业处理服务迁移到简约肯,该服务基于Amazon。使用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根据外部配置返回下一次重试的延迟。使用,只要使用者应用程序不删除消息,重试就会自动被SQS处理。但是,使用短缩,您可以通过使用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方法,根据外部数据返回不同的值。这是可能的,还是确实存在一种解决办法,可以用shoryuken来实现。
发布于 2015-09-17 01:30:45
目前,矮化只支持指数退避的固定值,但您可以提交一个更改ExponentialBackoffRetry的PR,其中:
# 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并不正式支持指数退避,它是在最短时间内使用可见性超时实现的,它可以延长到最长12小时。
ChangeMessageVisibility.html 您可以继续调用ChangeMessageVisibility将可见性超时延长到最长12小时。如果你试图延长超过12个小时,该请求将被拒绝。
https://stackoverflow.com/questions/32461435
复制相似问题