【问题标题】:Sidekiq strange behaviour of unique jobsSidekiq 独特作业的奇怪行为
【发布时间】:2012-11-09 13:47:16
【问题描述】:

嗯。我正在使用 Sidekiq 在后台转换视频文件。我使用sidekiq-unique-jobs gem 来避免作业与相同的有效负载对象重复。

我只在默认队列中运行我的 sidekiq 进程,没有选项,并发为 25。

问题是:每个作业在处理很长时间后(视频文件真的很大)进入队列积压,但处理的作业的大小也在增加。

工作既不完整也不独特。我被困住了。提前致谢

更新:

我将 Puma 作为 Web 服务器运行。

【问题讨论】:

  • 这些作业是否需要超过 30 分钟才能完成?
  • 远远超过 30 分钟。平均 3-4 小时

标签: ruby-on-rails ruby-on-rails-3 sidekiq


【解决方案1】:

尝试在没有 sidekiq-unique-jobs gem 的情况下运行它。无论如何,它只是保护你免受欺骗 30 分钟。该 gem 将其在 Redis 中的哈希键设置为在 30 分钟后自动过期(可配置)。 sidekiq 本身将其作业设置为在 Redis 中 24 小时后自动过期。

我显然看不到您的应用,但我敢打赌,您根本不想经常处理同一个文件。我会在应用层控制它,并跟踪我自己的 hashkey 做一些类似于 unique-jobs gem 正在做的事情:

hash = Digest::MD5.hexdigest(Sidekiq.dump_json(md5_arguments))

sidekiq-unique-jobs 中间件也可能妨碍sidekiq 了解作业是否正确完成。我敢打赌,在您的相同配置中使用长时间运行的作业测试此功能的人并不多。

如果您在没有附加中间件的情况下继续看到此行为,请尝试resque。我从未见过这种 gem 的这种行为,失败的作业在管理 GUI 中有一个有用的重试选项。

sidekiq 的主要好处是它是多线程的。即便如此,具有大型视频进程的 25 个并发可能会有点推动它。根据我的经验,分叉更稳定、更便携,对应用程序的线程安全 (YMMV) 的担忧更少。

无论您做什么,请确保您了解这些系统在其 Redis 中的数据上设置的自动过期 TTL 设置。工作的规模和性质意味着工作可以轻松备份 24 小时。这些自动删除发生在数据库层。如果作业被自动删除,应用层没有回调来发出警告。例如,在sidekiq 代码中,他们引入了自动过期行为以“避免任何可能的泄漏”。 (reference) 如果您真的需要执行这些工作,这不是很令人鼓舞。

【讨论】:

  • 好的,谢谢您的回复。实际上,现在我不再看到这种行为了,原因还不清楚。我做了什么:当然,我配置了唯一性到期并将其设置为 6 小时。我运行redis-cli FLUSHALL 清除所有作业,因为我有一个习惯不安全地杀死sidekiq 进程(出现旧作业的原因)。我还配置了ffmpeg,每个作业仅使用 2 个线程进行转换,并且只有 3 个 sidekiq 作业同时运行(我在服务器上有 8 个核心处理器)和 25 个并发 ffmpeg 作业对它来说太多了,不是吗? :)
  • 我知道没有必要使用sidekiq来解决这个问题,但我也将它用于其他类型的工作,我真的可以全力以赴,看到sidekiq真的很有效。所以我继续使用它,甚至用于视频转换。
  • 分叉另一个进程可能更稳定,但它也会在性能上引入大量过载。现在运行 25 个并发作业可能是可行的,但如果您要分叉进程,则可能只能运行 5 个。
猜你喜欢
  • 2015-05-27
  • 1970-01-01
  • 1970-01-01
  • 2011-09-04
  • 1970-01-01
  • 2015-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多