我有一个sidekiq作业运行了一段时间,当我部署到heroku并且该作业正在运行时,它不能在几秒钟内完成。
这很好,因为作业的设计是可以在需要时重新运行的。
问题是作业丢失(而不是放回redis并在部署后再次运行)。
我发现建议在heroku上设置:timeout: 8,我试了一下,但没有效果(也试了看5)。
当出现异常时,我会得到错误报告,但我看不到任何错误。所以不知道怎么回事。
有什么调试技巧吗?

最佳答案

sidekiq的免费版本将在超时(默认为8秒)后将未完成的作业推回到redis。Heroku给进程10秒的时间来关闭。这意味着我们有2秒钟的时间将这些作业返回redis,否则它们将丢失。如果您的网络速度很慢,如果redis服务器正在交换,等等,那么2秒的期限可能无法满足,作业将丢失。
你走上了正确的轨道:一个答案是降低超时时间,这样你就有更好的机会达到最后期限。但无法预测网络或交换延迟:即使是5秒也可能不够。
在正常的健康状况下,事情应该按设计的那样进行。保持您的机器健康(未被占用的网络,充足的RAM)和基本的抓取应该工作良好。sidekiq pro的可靠获取功能是对sidekiq如何获取作业以及如何解决所有这些问题的基本重新设计,它始终将作业保存在redis中,这样它们就不会丢失。但它也带来了严重的折衷:它比“基本”获取更复杂、更慢、更密集。
简而言之,我不知道你为什么会失业,但是要确保你的实例和redis服务器是健康的,并且延迟很低。
https://github.com/mperham/sidekiq/wiki/Using-Redis#life-in-the-cloud

关于ruby-on-rails - 部署到Heroku时,当前的Sidekiq工作丢失,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35555000/

10-13 07:14