部署到 Heroku 时当前 Sidekiq 作业丢失

Current Sidekiq job lost when deploying to Heroku

我有一个 运行 有一段时间的 Sidekiq 作业,当我部署到 Heroku 并且作业 运行ning 时,它无法在几秒钟内完成。

没关系,因为该作业的设计目的是可以在需要时重新运行。

问题是作业丢失了(而不是放回 Redis 并在部署后再次 运行)。

我发现建议在heroku上设置:timeout: 8,我试过了,但是没有效果(也试过设置到5)。

当出现异常时,我收到错误报告,但我没有看到任何错误。所以不确定哪里出了问题。

关于如何调试这个的任何提示?

这实际上是 sidekiq 的功能 - 旨在引导您使用付费专业版: http://sidekiq.org/products/pro

RELIABILITY

More reliable message processing.

Cloud environments are noisy and unreliable. Seeing timeouts? Wild swings in latency or performance? Ruby VM crashes or processes disappearing?

If a Sidekiq process crashes while processing a job, that job is lost.

If the Sidekiq client gets a networking error while pushing a job to Redis, an exception is raised and the job is not delivered.

Sidekiq Pro uses Redis's RPOPLPUSH command to ensure that jobs will not be lost if the process crashes or gets a KILL signal.

The Sidekiq Pro client can withstand transient Redis outages or timeouts. It will enqueue jobs locally upon error and attempt to deliver those jobs once connectivity is restored.

部署终止属于用户的所有进程,因此作业丢失。实际上你能做的并不多。

Sidekiq 免费版会在超时后将未完成的作业推送回 Redis,默认为 8 秒。 Heroku 为进程提供 10 秒的关闭时间。这意味着我们有 2 秒的时间将这些作业返回到 Redis ,否则它们将丢失。如果您的网络速度很慢,如果 Redis 服务器正在交换等,则可能无法满足 2 秒的截止日期并且作业会丢失。

您走在正确的轨道上:一个答案是缩短超时时间,这样您就更有可能在最后期限前完成。但无法预测网络或交换延迟:即使 5 秒也可能不够。

在正常的健康条件下,事情应该按设计进行。保持你的机器健康(不拥塞的网络,大量的 RAM)并且基本的获取应该运行良好。 Sidekiq Pro 的可靠获取功能是对 Sidekiq 获取工作的方式的根本性重新设计,并通过始终将工作保留在 Redis 中来解决所有这些问题,这样它们就不会丢失。但它也有严重的权衡取舍:它比 "basic" fetch 更复杂、更慢、更密集的 Redis。

简而言之,我不知道您为什么会失业,但请确保您的实例和 Redis 服务器运行良好且延迟较低。

https://github.com/mperham/sidekiq/wiki/Using-Redis#life-in-the-cloud

正如@mike-perham 和@esse 指出的那样,Sidekiq 的设计方式使其可以由于其获取机制而失去工作。解决此问题的选项是:

  1. 购买 Sidekiq Pro(虽然 reported 导致同样的问题)
  2. 编写您自己的提取器(但这意味着您不能使用大多数第 3 方库,因为它们不能与您的自定义提取器一起使用)
  3. 通过备份您的作业数据来模仿 Sidekiq Pro 的可靠提取。如果您喜欢这种方式,请查看 attentive_sidekiq gem 正是这样做的。