这是在多个Sidekiq实例和工作人员同时运行,似乎已经产生了一些问题,例如实例被分配了"它最近被警告"不应该出现错误,而不是相反。
很少见,但它正在发生,这是问题还是其他的东西?
{{1}}
答案 0 :(得分:3)
我们在工作中遇到了类似的情况,经过大量的挖掘终于弄清了正在发生的事情。
类方法validates_with
使用验证器的一个实例(BrokenValidator
)来验证您要验证的类(BrokenModel
)的所有实例。通常,这很好,但是您正在分配变量(@record
,然后通过另一种方法(check_alerted
访问该变量,因此其他线程正在分配@record
,而其他线程仍在尝试{{ 1}}。
有两种方法可以解决此问题:
1)将check_alerted
传递到record
:
check_alerted
2)使用class BrokenValidator < ActiveModel::Validator
def validate(record)
check_alerted(record)
end
private
def check_alerted(record)
if AtomicGlobalAlerted.new(record).valid?
record.errors[:base] << "It was alerted recently"
end
p "check_alerted: #{record.errors[:base]}"
end
end
的实例版本,它为要验证的每个模型实例创建一个新的验证器实例:
validates_with
任何一种解决方案都可以解决并发问题。如果您遇到其他任何问题,请告诉我。
答案 1 :(得分:-1)