我一直在寻找这个问题的解决方案。我尝试用谷歌搜索,但还没有找到任何东西。
问题:
我有这个工人
class MailWorker
def perform(user_id)
user = User.find(user_id)
...
end
end
有时已经运行了很长时间。然后,需求发生变化,我们必须传递reservation_id而不是user_id。
因此工作人员更新为:
class MailWorker
def perform(reservation_id)
reservation = Reservation.find(reservation_id)
....
end
end
问题是,如果我们推送此代码,一些工作人员已经在 Q 中。因此,这些工作人员将尝试找到用户,但新代码正在使用事务。
对此最好的方法是什么?我们是否必须创建新的 Worker 而不是使用现有的 Worker,并在安全后删除旧的 Worker?或者有什么办法可以解决这个问题吗?
谢谢
我会亲自为此创建一个新的 Worker。
这使得处理所有工作变得更加容易。 (并且向后兼容)
我遇到了同样的问题,并且问题已升级到生产环境。根据我的学习,您可以使用两种方法。
我已将详细信息记录在我的个人笔记中
https://rslhdyt.dev/til-handling-changes-to-sidekiq-worker-class/