Sidekiq没有将作业添加到队列中

时间:2014-11-02 22:19:00

标签: ruby-on-rails ruby sidekiq

前段时间我写了一个小型Ruby应用程序,它使用Sidekiq转换视频文件,并将它们推向少数在线视频托管服务。我使用两个工人和队列,一个实际转换文件,另一个发布转换文件。作业被推送到第一个Queue by Rails应用程序进行转换,成功处理后,转换工作程序将上传作业推送到第二个队列。

 Rails -> Converter Queue -> Uploader Queue

最近我发现转换器库中出现了大量的内存泄漏,它出现在每个几个作业之后并且整个服务器都超载了,所以我做了一点点黑客来避免这种情况,通过使用Interrupt异常停止整个Sidekiq Worker进程并再次启动它由Systemd。

直到昨天它才能完美运作。我收到客户的通知,说明文件没有转换。我做了一些调查,发现什么是失败的,发现作业没有添加到转换器队列。它在代码或服务没有任何变化的情况下开始失败。当Rails向Sidekiq Queue添加作业时,它会收到正确的作业ID,完全没有异常或警告,但作业根本不会出现在任何队列中。我检查了Redis日志,Systemd日志,dmesg,我可以检查的每个日志,甚至没有发现任何最小的警告 - 似乎工作在真空中丢失了:/事实上,经过更多的挖掘和调试后我发现如果一个工作是快速推进(循环100次),然后Sidekiq有可能为Queue添加工作。当然,有时它会添加所有工作,有时甚至不会单一工作。

第二个Queue完美运行 - 它选择我添加到它的每一个作业。当我尝试添加1000个新作业时,第二个队列将它们全部排队,当转换器队列获得最多10个作业时。当我尝试使用另一个队列时,事情变得非常奇怪 - 我将100个作业推送到新的队列,当然所有这些都被正确添加,然后我指示转换工作者使用该新队列。并且它可以工作 - 我可以向该队列添加新的作业,并且似乎所有这些都被成功推送 - 但是当Worker完成处理所有在该Worker被分配到此Queue之前被推送的作业时,它又开始失败。在每项工作后禁用重新启动Worker的代码根本没有帮助。

有趣的是,实际上作业被推送到队列,但只有当我多次推动它时,并且当正确添加Job时,它似乎完全随机。这个错误从无处出现,几个月的事情完美无缺,最近开始失败而代码或服务器没有任何变化。日志非常清楚,Sidekiq与相同的Redis服务器一起使用而没有其他应用程序的任何问题 - 似乎只有这个特定的工作者才有这个问题。我没有在网上找到任何类似bug的引用,我花了两天时间试图调试这个并找到这种奇怪行为的来源,我什么都没发现,一切似乎都完美无缺,乔布斯只是在推送和Redis数据库之间消失了

0 个答案:

没有答案