尝试在执行方法中销毁对象时的 Sidekiq 最佳实践
Sidekiq best practice when try to destroy object in perform method
在side perform方法中调用AC destroy安全吗?我有这个方法,它会循环遍历设备并发送通知,如果失败,它会在救援中销毁该设备。
是否有可能一个线程 A 在这一行之后暂停 "devices = Device.where(id: device_ids)" 并且线程 B 销毁了线程 A 暂停的同一个设备对象,当线程 A 恢复时,"devices" 已经被销毁了?如何处理这个问题>
def perform(device_ids, message)
devices = Device.where(id: device_ids)
devices.each do |device|
begin
device.send_notification(message)
rescue Aws::SNS::Errors::EndpointDisabled
device.destroy
end
end
end
如果他们都试图破坏相同的数据库记录,是的,可能存在竞争条件。通常你拯救并忽略错误。
在side perform方法中调用AC destroy安全吗?我有这个方法,它会循环遍历设备并发送通知,如果失败,它会在救援中销毁该设备。
是否有可能一个线程 A 在这一行之后暂停 "devices = Device.where(id: device_ids)" 并且线程 B 销毁了线程 A 暂停的同一个设备对象,当线程 A 恢复时,"devices" 已经被销毁了?如何处理这个问题>
def perform(device_ids, message)
devices = Device.where(id: device_ids)
devices.each do |device|
begin
device.send_notification(message)
rescue Aws::SNS::Errors::EndpointDisabled
device.destroy
end
end
end
如果他们都试图破坏相同的数据库记录,是的,可能存在竞争条件。通常你拯救并忽略错误。