微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将 sidekiq 作业延迟 10 分钟,并最终计算它们?

如何解决如何将 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 举报,一经查实,本站将立刻删除。