我有一個Sidekiq作業運行一段時間,當我部署到Heroku並且作業正在運行時,它無法在幾秒鐘內完成。部署到Heroku時當前Sidekiq工作丟失
這很好,因爲工作的目的是可以在需要時重新運行。
問題是作業丟失(而不是放回到redis並在部署後再次運行)。
我發現建議在heroku上設置:timeout: 8
,我嘗試了它,但它沒有效果(也嘗試將其設置爲5)。
當出現異常時,我收到錯誤報告,但我沒有看到任何錯誤。所以不知道什麼是錯的。
有關如何調試的任何提示?
我有一個Sidekiq作業運行一段時間,當我部署到Heroku並且作業正在運行時,它無法在幾秒鐘內完成。部署到Heroku時當前Sidekiq工作丟失
這很好,因爲工作的目的是可以在需要時重新運行。
問題是作業丟失(而不是放回到redis並在部署後再次運行)。
我發現建議在heroku上設置:timeout: 8
,我嘗試了它,但它沒有效果(也嘗試將其設置爲5)。
當出現異常時,我收到錯誤報告,但我沒有看到任何錯誤。所以不知道什麼是錯的。
有關如何調試的任何提示?
免費版本的Sidekiq會在超時後超過8秒的時間將未完成的作業推送回Redis。 Heroku給出了一個過程10秒關閉。這意味着我們有2秒的時間將這些作業恢復到Redis 或者他們將丟失。如果您的網絡速度較慢,如果Redis服務器正在交換等,則可能無法滿足2秒的最後期限,並且作業丟失。
你走的是正確的道路:一個答案是降低超時時間,以便你有更好的機會達到最後期限。但網絡或交換延遲無法預測:甚至5秒可能不夠。
在正常的健康狀況下,事情應該按照設計進行。保持你的機器健康(擁塞網絡,大量的RAM),基本的抓取工作應該很好。 Sidekiq Pro的可靠獲取功能是對Sidekiq如何提取作業進行重新設計,並通過始終在Redis中保留作業以解決所有這些問題,以便不會丟失。但它也帶來了嚴重的折衷:與「基本」獲取相比,它更復雜,更慢並且Redis密集程度更高。
總之,我不知道爲什麼你會失去工作,但要確保你的實例和Redis服務器健康並且延遲很低。
https://github.com/mperham/sidekiq/wiki/Using-Redis#life-in-the-cloud
這實際上是功能sidekiq的 - 旨在引導你走向支付專業版: http://sidekiq.org/products/pro
可靠性
更可靠的消息處理。
雲環境嘈雜且不可靠。看到超時?延遲或性能大幅波動? Ruby VM崩潰或進程消失?
如果一個Sidekiq進程在處理作業時崩潰,那個作業就會丟失。
如果Sidekiq客戶端在將作業推送到Redis時發生網絡錯誤,則會引發異常並且不會傳遞作業。
Sidekiq Pro使用Redis的RPOPLPUSH命令確保作業不會丟失,如果進程崩潰或獲取KILL信號。
Sidekiq Pro客戶端可以承受瞬間Redis中斷或超時。它會在出現錯誤時將本地作業排隊,並在連接恢復後嘗試傳送這些作業。
部署終止屬於用戶的所有進程,因此作業丟失。在那裏實際上沒有太多可以做的事情。
正如@邁克 - 佩勒姆和@esse指出,Sidekiq設計可以鬆作業的方式,由於其抓取機制。您的選擇來解決這個問題是:
將超時時間進一步降低到2秒可以解決問題,現在已經足夠了。謝謝! – hakunin