如何在 Sidekiq 中引发错误时放弃在异步任务上执行的所有更改?

How to discard all changes executed on an async task when it raises an error in Sidekiq?

我正在使用 Sidekiq 和 Rails (6.0.3.7)。我有一个执行异步任务的工作人员,该任务按顺序在我的数据库中创建大量数据。所以基本上它发生的是,例如:

有时,此过程会中途失败,可能是在创建 Post 类别时,或者在创建 Post.

我想要发生的是,如果任务在任何给定点失败,所有已经在该任务中创建的数据都将被丢弃。另一种方法可能是所有数据只有在我确定该过程没有失败后才会创建。所以基本上它必须在实际写入数据库之前“检查创建”所有内容。

这方面的一个例子是用户已经创建,但由于某种原因,它未能创建 Post类别,并且 AsyncTask 失败。我想要发生的是它自动删除创建的用户,或者它一开始就没有创建,因为任务失败了。

有没有什么方法或技术可以在我当前的工作人员上执行此操作,而不会过多地干扰实际代码?某些“双重检查”方法已经在 Sidekiq 上实施了吗?你建议我应该研究什么?

在此先感谢您在这个问题上给我的任何帮助。

首先,太好了,您将任务设计为全或-none。主要且更可取的方法是使用数据库事务,因为这是它们的设计目的。在开始实体创建之前打开事务,并在完成所有检查后提交。

Account.transaction do
    balance.save!
    account.save!
end

注意 bang 方法(那些尾随 ! 的方法)它们的目的是抛出异常。异常会自动回滚事务,这就是你需要的。

N.B。尝试使您的任务 幂等 这意味着返回相同的结果,而不管具有相同输入结果的调用次数如何。这可以在将来节省很多时间。