首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sidekiq与lock_expiration不按预期工作的唯一作业

Sidekiq与lock_expiration不按预期工作的唯一作业
EN

Stack Overflow用户
提问于 2022-01-13 11:53:22
回答 1查看 683关注 0票数 6

我对lock_expiration和sidekiq独特的工作有个问题。

代码语言:javascript
复制
gem 'sidekiq', '4.2.10'
gem 'sidekiq-cron', '1.2.0'
gem 'sidekiq-unique-jobs', '6.0.25'

有以下几个选项:

代码语言:javascript
复制
sidekiq_options queue: :medium, retry: 3, lock: :until_executed, lock_expiration: 120 * 60

当此员工已运行时:

代码语言:javascript
复制
[1] pry(main)> HardWorker.perform_async
=> 53b93f122fddbb2ebd350332267484ea

作业完成,因为执行是一个空方法。锁发生了,我在redis中看到了这个:

如果可用键仍然存在于redis中,即在5秒TTL过期之前。只要刷新TTL和该键,我就可以为另一个作业排队并继续这样做。但是,在5秒和该键过期后,在“存在”键过期之前,我无法对其他作业进行排队。

我希望在5秒过去之后,我能够为另一个作业排队。我非常肯定,在作业正确完成后,应移除现有键。但这种事不会发生。作业可以排队,但只能在可用密钥的TTL中排队。

我正在从一个非常老的版本升级。这是我在没有升级系统其他主要部分的情况下所能做的。

我的问题是,这是否有意的行为?基于我们已经完成的升级和配置属性的替换。它应该能像以前那样工作。也就是说,能够在当前作业完成后排起队。

假设这要么是错误,要么是有意的行为。我怎么才能有这种行为?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-24 17:59:55

我相信您的理解是正确的,并且只要调用了worker的perform方法(基于docs中为until_executed策略描述的语义),锁就应该被清除。如果没有发生这种情况,您可能会遇到一个bug。

然而,sidekiq-unique-jobs的6.x版本被作者描述为"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提供了独特的工作支持,在我的经验中证明了它是有效的防弹功能。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70696157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档