如何解决如何将 sidekiq 作业延迟 10 分钟,并最终计算它们?
目前,每次模型属性更改时,我都会执行特定的 sidekiq 作业。
示例:我正在更改并保存以下每个属性:标题、描述和文本。所以现在将执行 3 个 sidekiq 作业。
title was changed
description was changed
text was changed
如何设置 sidekiq 在第一次属性更改后等待 10 分钟,然后在 jobs.count > 1
时执行特定作业?
示例:我再次更改并保存以下每个属性:标题、描述和文本。现在在 10 分钟内,它应该只执行 1 个带有类似消息的 sidekiq 作业。
3 attributes were updated
解决方法
听起来您需要某种去抖动。 这是符合您标准的 sidekiq 去抖动。
我从未尝试过,但是这个 gem gem 'sidekiq-debouncer'
的自述文件完全描述了相同类型的流程。
https://github.com/paladinsoftware/sidekiq-debouncer 安装这个 gem。
将参数设置为要考虑去抖动的作业,例如类的主键。
所以你需要的是这样的东西。
class MyWorker
include Sidekiq::Worker
include Sidekiq::Debouncer
sidekiq_options(
debounce: {
time: 10 * 60
},by: -> (job_args) {
job_args[0] # this is the ID you pass in the argument in `perform` method.
}
)
def perform(id,attributes)
# perform your action on that record.
# and if you are using the class variable like I've explained below,just reset that.
end
end
原来如此。
您可以使用类似我在 perform 方法中提到的类变量作为注释,其中包含有关已更新但未为此执行 sidekiq 作业的属性的信息。
class Something
@@unperformed_updated_attributes = {}
def setup
@@unperformed_updated_attributes[id].merge!(updated_attribute: new_value)
end
def reset
@@unperformed_updated_attributes[id] = {}
end
end
这是粗略的介绍。但你可以做这样的事情来实现你想要的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。