更高级的Delayed Job工作者重试控制

3
所以我正在使用Delayed::Job工作程序(在Heroku上)作为用户创建某个模型后的after_create回调。
尽管如此,一个常见的用例是用户创建某些内容,然后立即将其删除(可能是因为他们犯了一个错误或其他原因)。
当这种情况发生时,工作程序会启动,但当它们查询手头的模型时,它已经被删除了,但由于自动重试功能,这个不幸的作业将重试25次,并且肯定永远不会成功。
有没有办法捕获特定的错误,并在发生时防止该特定作业再次重试,但如果不是那个错误,则将来会重试?
2个回答

3
为了进一步解释David的答案,不要这样做: ```html

...

```
def after_create
   self.send_later :spam_this_user
end

我会这样做:

# user.rb

def after_create
   Delayed::Job.enqueue SendWelcomeEmailJob.new(self.id)
end

# send_welcome_email_job.rb

class SendWelcomeEmailJob <  Struct(:user_id)
   def perform
      user = User.find_by_id(self.user_id)
      return if user.nil?  #user must have been deleted

      # do stuff with user
   end
end

但那看起来很丑,与他们其他美丽的非影响设计相比 :) 我想另一个真正的问题是 - 这25个失败是否真的会引起问题? - Kevin
1
工作应该具有容错性并可重新运行。如果不是这种情况,那么你应该重新思考延迟任务的设计或者确保任务了解它可以“处理”的错误,并执行适当的操作。可能是静默退出,避免错误导致重新运行。 - Ben Scheirman

3
将检查操作封装到使用delayed_job调用的函数中。判断相关条件,确定所需的作业能否继续执行,然后处理该作业或返回成功。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接