Dic*_*Boy 7 ruby ruby-on-rails sidekiq sidekiq-unique-jobs
我遇到了 lock_expiration 和 sidekiq 独特作业的问题。
gem 'sidekiq', '4.2.10'
gem 'sidekiq-cron', '1.2.0'
gem 'sidekiq-unique-jobs', '6.0.25'
Run Code Online (Sandbox Code Playgroud)
使用 sidekiq 选项:
gem 'sidekiq', '4.2.10'
gem 'sidekiq-cron', '1.2.0'
gem 'sidekiq-unique-jobs', '6.0.25'
Run Code Online (Sandbox Code Playgroud)
当该工作程序运行时:
[1] pry(main)> HardWorker.perform_async
=> 53b93f122fddbb2ebd350332267484ea
Run Code Online (Sandbox Code Playgroud)
由于执行的是空方法,因此作业完成。锁定发生了,即我在 redis 中看到了这一点:
如果 AVAILABLE key 在 5 秒 TTL 过期之前仍然存在于 redis 中。只要我刷新该 TTL 并且该密钥存在,我就可以将另一项作业加入队列并继续执行此操作。但是,5 秒后,该密钥过期,我无法将另一个作业排入队列,直到 EXISTS 键过期。
我希望 5 秒过去后能够将另一项作业加入队列。我非常确定在作业正确完成后应该删除 EXISTS 键。但这并没有发生。该作业可以排队,但只能在 AVAILABLE 键的 TTL 内。
我正在从非常旧的版本升级 sidekiq。这是我在不升级系统其他主要部分的情况下所能做到的。
我的问题是,这是有意的行为吗?基于我们所做的升级和配置属性的替换。它应该像以前一样工作。即能够在当前作业完成后将作业排队。
假设这是一个错误或预期的行为。我怎样才能得到这种行为?
我相信您的理解是正确的,并且一旦perform
调用工作人员的方法(基于until_executed
文档中为策略描述的语义),锁就应该被清除。如果没有发生这种情况,您可能遇到了错误。
但是,其作者将 6.x 版本sidekiq-unique-jobs
描述为"the worst mistake I ever made as a software engineer"
(https://github.com/mhenrixon/sidekiq-unique-jobs/issues/553#issuecomment-732719189)和"not stable"
(https://github.com/mhenrixon/ sidekiq-unique-jobs/issues/553#issuecomment-733151792)。我建议您至少升级到 7.x,然后再费力解决这个问题。
(或者,如果可以的话,Sidekiq Enterprise 还提供独特的就业支持,根据我的经验,这证明它是有效的。)
归档时间: |
|
查看次数: |
1738 次 |
最近记录: |