gpt4 book ai didi

ruby - 使用排队系统进行后续属性计算

转载 作者:数据小太阳 更新时间:2023-10-29 07:18:43 24 4
gpt4 key购买 nike

对于以下所有假设:

  • 轨道 v3.0
  • ruby v1.9
  • 请求

我们有 3 个模型:

  • 产品 belongs_to :sku, belongs_to :category
  • Sku has_many :products, belongs_to :category
  • 类别 has_many :products, has_many :skus

当我们更新产品(假设我们禁用它)时,我们需要对相关的 sku 和类别进行一些调整。更新 sku 时也是如此。

实现此目的的正确方法是在每个模型上都有一个 after_save 来触发其他模型的更新事件。

示例:

products.each(&:disable!)
# after_save triggers self.sku.products_updated
# and self.category.products_updated (self is product)

现在,如果我们有 5000 种产品,我们就可以大饱口福了。同一类别可能会更新数百次,并在更新时占用数据库。

我们还有一个很好的排队系统,所以更现实的更新产品的方法是 products.each(&:queue_disable!),它会简单地将 5000 个新任务扔到工作队列中。 5000个类别更新的问题仍然存在。

有没有办法避免数据库上的所有这些更新?

我们如何连接队列中每个类别的所有 category.products_updated?

最佳答案

您可以使用几个 Resque 插件确保所有产品的单一类别更新:Resque Unique JobResque Scheduler .

延迟作业的执行以稍微更新类别(无论调用所有产品更新通常需要多长时间)并通过包含唯一作业模块确保每个作业都是唯一的。 Unique Job 使用作业的参数,因此如果您尝试将 2 个 category_id 为 123 的作业加入队列,它会忽略第二个作业,因为该作业已经在队列中。

class Product
after_save :queue_category_update

def queue_category_update
Resque.enqueue_at(1.minute.from_now, Jobs::UpdateCategory, category.id) if need_to_update_category?
end
end

module Jobs
module UpdateCategory
include Resque::Plugins::UniqueJob

def self.perform(category_id)
category = Category.find_by_id(category_id)
category.update_some_stuff if category
end
end
end

关于ruby - 使用排队系统进行后续属性计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9664007/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com