gpt4 book ai didi

ruby-on-rails - 如何防止并行 Sidekiq 作业在 Rails 中执行代码

转载 作者:行者123 更新时间:2023-12-03 13:19:40 34 4
gpt4 key购买 nike

我有大约 10 名 worker 从事以下工作:

user = User.find_or_initialize_by(email: 'some-email@address.com')

if user.new_record?
# ... some code here that does something taking around 5 seconds or so
elsif user.persisted?
# ... some code here that does something taking around 5 seconds or so
end

user.save

问题是在某些时候,两个或更多的工作人员在准确的时间运行这段代码,因此我后来发现两个或更多的用户有相同的email,我应该在其中始终只有唯一的电子邮件。

我的情况不可能为 email 创建数据库唯一索引,因为唯一的电子邮件是有条件的——有些用户应该有唯一的电子邮件,有些则没有。

值得注意的是,我的 User 模型具有唯一性验证,但它仍然对我没有帮助,因为在 .find_or_initialize_by.save,有一个代码依赖于用户对象是否已经创建。

我尝试了悲观和乐观锁定,但它们对我没有帮助,或者我可能只是没有正确实现它......您是否对此有一些建议。

我唯一能想到的解决方案是在执行这些代码行时锁定其他线程(Sidekiq 作业),但我不太确定如何实现它,也不知道这是否是一种建议的方法。

如有任何帮助,我将不胜感激。

编辑

在我的具体情况下,很难将电子邮件参数放入作业中,因为该作业比上面所说的要复杂一些。该作业实际上是一个导出脚本,其中作业的一部分是上面的代码。我不认为也可以将上面的功能分离到另一个单独的工作人员中......因为整个工作流程应该是串行的,并且不应并行/异步处理任何部分。该作业只是由另一个作业管理的作业之一,而另一个作业最终由 master 作业管理。

最佳答案

悲观锁定是您想要的,但仅适用于存在的记录 - 您不能将其与 new_record? 一起使用,因为数据库中还没有要锁定的内容。

关于ruby-on-rails - 如何防止并行 Sidekiq 作业在 Rails 中执行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28482807/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com