尝试在执行方法中销毁对象时的 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

如果他们都试图破坏相同的数据库记录,是的,可能存在竞争条件。通常你拯救并忽略错误。