2016-02-22 56 views
2

我有一個Sidekiq作業運行一段時間,當我部署到Heroku並且作業正在運行時,它無法在幾秒鐘內完成。部署到Heroku時當前Sidekiq工作丟失

這很好,因爲工作的目的是可以在需要時重新運行。

問題是作業丟失(而不是放回到redis並在部署後再次運行)。

我發現建議在heroku上設置:timeout: 8,我嘗試了它,但它沒有效果(也嘗試將其設置爲5)。

當出現異常時,我收到錯誤報告,但我沒有看到任何錯誤。所以不知道什麼是錯的。

有關如何調試的任何提示?

回答

3

免費版本的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

+0

將超時時間進一步降低到2秒可以解決問題,現在已經足夠了。謝謝! – hakunin

5

這實際上是功能sidekiq的 - 旨在引導你走向支付專業版: http://sidekiq.org/products/pro

可靠性

更可靠的消息處理。

雲環境嘈雜且不可靠。看到超時?延遲或性能大幅波動? Ruby VM崩潰或進程消失?

如果一個Sidekiq進程在處理作業時崩潰,那個作業就會丟失。

如果Sidekiq客戶端在將作業推送到Redis時發生網絡錯誤,則會引發異常並且不會傳遞作業。

Sidekiq Pro使用Redis的RPOPLPUSH命令確保作業不會丟失,如果進程崩潰或獲取KILL信號。

Sidekiq Pro客戶端可以承受瞬間Redis中斷或超時。它會在出現錯誤時將本地作業排隊,並在連接恢復後嘗試傳送這些作業。

部署終止屬於用戶的所有進程,因此作業丟失。在那裏實際上沒有太多可以做的事情。

+0

謝謝,有沒有一種方法可以告訴線程在有即將被終止時進行提升?那會讓他們回到隊列中。 – hakunin

+0

您可以嘗試抓取信號:http://ruby-doc.org/core-2.2.0/Signal.html,但我從來沒有在這方面做過,所以我不確定它會是可靠的。 – Esse

+0

您暗示免費版本會失去工作,因此您需要爲Pro版本付費。 100%錯誤。 https://github.com/mperham/sidekiq/blob/master/lib/sidekiq/manager.rb#L120 –

2

正如@邁克 - 佩勒姆和@esse指出,Sidekiq設計可以鬆作業的方式,由於其抓取機制。您的選擇來解決這個問題是:

  1. 買Sidekiq臨(雖然它reported造成相同的問題)
  2. 要編寫自己的提取程序(但是這意味着你不能使用大多數第三方的庫,因爲它們不會與您的自定義提取器一起工作)
  3. 通過備份作業數據來模擬Sidekiq Pro的可靠獲取。如果你是這種方式,請檢查出attentive_sidekiq寶石,確實如此。