Sidekiq超时

3
我在我的Rails应用中使用sidekiq来异步执行存储过程,该存储过程在用户从一个特定页面转移到另一个页面时会被执行。但问题是,这个存储过程需要4分钟才能完成,sidekiq返回一个超时消息(然后重试)。我不想改变database.yml中全局数据库超时设置(我甚至不知道它是否有效,但我不能这样做)。有没有办法告诉sidekiq我的方法可能需要很长时间,然后停止出现超时错误?非常感谢任何帮助。
更新#1:
2013-06-03T17:14:18Z 6136 TID-1ac4ik GeneratePropertyProfile JID-de571df94f21b9159c74db6b INFO: 开始
2013-06-03T17:19:03Z 6136 TID-1ac4ik GeneratePropertyProfile JID-de571df94f21b9159c74db6b INFO: 失败:285.218秒
2013-06-03T17:19:03Z 6136 TID-1ac4ik WARN: {"retry"=>true, "queue"=>"default", "class"=>"GeneratePropertyProfile", "args"=>[{"id"=>41915658}], "jid"=>"de571df94f21b9159c74db6b", "error_message"=>"TinyTds::Error: Adaptive Server connection timed out: EXEC gaiainc.sp_wait", "error_class"=>"ActiveRecord::StatementInvalid", "failed_at"=>2013-06-03 17:19:03 UTC, "retry_count"=>0}
2013-06-03T17:19:03Z 6136 TID-1ac4ik WARN: TinyTds::Error: Adaptive Server connection timed out: EXEC gaiainc.sp_wait
更新#2:
我成功地在不改变database.yml的情况下使其工作。但是,我必须在我的initializers/sidekiq.rb中添加以下代码:
Sidekiq.configure_server do |config|
  ActiveRecord::Base.connection.disconnect!
  ActiveRecord::Base.configurations[Rails.env]['timeout'] = 300000
  ActiveRecord::Base.establish_connection
end

我知道这不是一个美观的解决方案,但我没有时间找到其他解决方案来使它工作。

如果有人有更清晰的解决方案,请在此主题中回复。

谢谢!

1个回答

6

TERM信号表示Sidekiq应该在-t超时选项内关闭。任何在超时时间内未完成的工作人员都将被强制终止,他们的消息将会丢失。超时时间默认为8秒。

Sidekiq TERM超时时间在config/sidekiq.yml中设置或使用-t参数。当收到TERM信号时,Sidekiq将尽力在此超时时间内退出。

:timeout: 300

我尝试将超时设置放在config/sidekiq.yml中,但问题仍然存在。我将超时设置为300,并调用了一个休眠285秒的存储过程,但sidekiq仍然不断抛出超时错误。 - stefanobaldo
请查看我的最新帖子更新:这是来自Sidekiq的输出。在285秒内,我的存储过程(因此也是我的_perform_方法)已经完成,但是Sidekiq表示该方法失败了。 - stefanobaldo
问题在于数据库适配器超时,而不是Sidekiq。我通过更改database.yml中的数据库超时设置使其工作,但是我无法将生产数据库超时设置更改为300000毫秒。有什么想法吗? - stefanobaldo
如果无法更改数据库参数,我建议您检查是否可以简化或优化数据库请求。也许您正在为每个项目更新大量集合,这可以用联接更新替换,或者通过一次插入大量项目来插入它们,并且它们可以通过仅一个请求插入。需要更多信息... - Ivan Shamatov
我可以优化我的数据库请求(不多),但不幸的是我现在没有时间去做。我使用了一个丑陋的(我认为)解决方案来使其工作-请查看我的帖子更新。 - stefanobaldo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接