2015-09-08 36 views
2

我正在將使用sidekiq製作的後臺作業處理服務遷移到shoryuken,它基於Amazon SQS。 隨着sidekiq您可以通過使用sidekiq_retry_in定製重試模式:使用Shoryke​​n(Amazon)SQS定製重試延遲(ruby)

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改變延遲,但documentation僅介紹如何設置固定值:使用retry_count

class MyWorker 
    include Shoryuken::Worker 

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

end 

我需要以同樣的方式定製延遲重試與sidekiq,方法根據外部數據返回不同的值。這是可能的還是確實存在一個解決方法來做到這一點與shoryuken

回答

3

目前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 

所以,你將能夠使用一個進程或固定值來設定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小時)在Shoryuken中實施的。

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

您可以繼續撥打ChangeMes​​sageVisibility的可見性超時延長到最多12小時。如果您嘗試延長超過12小時,該請求將被拒絕。