【问题标题】:Undefined Method errors on basic AR and AS methods when running threaded with Sidekiq on Heroku在 Heroku 上使用 Sidekiq 运行线程时,基本 AR 和 AS 方法出现未定义方法错误
【发布时间】:2012-11-12 23:09:38
【问题描述】:

在我的一个模型中运行 Sidekiq 排队作业时,我在特定代码行中遇到了几个不同的错误。有问题的代码是:

@lookup_fields[:asin] ||= self.book_lookups.find_by_name("asin").try(:value)

我要么得到undefined method 'scope' for #<ActiveRecord::Associations::AssociationScope:0x00000005f20cb0> 要么得到undefined method 'aliased_table_for' for #<ActiveRecord::Associations::AliasTracker:0x00000005bc3f90>

在另一个 Sidekiq 作业的另一行代码中,我收到错误 undefined method 'decrypt_and_verify' for #<ActiveSupport::MessageEncryptor:0x00000007143208>

所有这些错误都毫无意义,因为它们是 Rails 运行时支持库的标准方法。

有问题的模型具有为“book_lookups”模型定义的 :has_many 关联,“name”和“value”是“book_lookups”模型中的字段。这总是发生在处理的前 1-3 条记录上。如果我在 Sidekiq 作业之外运行相同的代码,则不会发生这些错误。

我无法在我的开发机器上重现该错误,只能在 Heroku 托管的生产环境中重现。

我可能已经通过将代码“BookLookup.new()”放入初始化程序中“解决”了第一组错误,强制模型在 Sidekiq 创建任何线程之前加载。只有一晚的工作要继续,所以我们必须看看这种趋势是否会持续......

即使这解决了眼前的问题,我认为它并不能解决真正的潜在问题,即类在使用之前没有完全加载。类加载是原子操作吗?是否有可能一个线程开始加载一个类而另一个线程在该类完全加载之前开始使用它?

【问题讨论】:

  • 你能发布更多关于你的人际关系的代码吗?
  • 我不确定您可能希望看到哪些附加代码。该关联是通过“has_many :book_lookups”建立的,并由“belongs_to :books”作为回报。这段代码每晚都运行了 3 个月,直到最近才出现错误。我真的认为问题与多线程有关。我已经尝试强制 BookLookup 模型在启动时加载(在任何多线程发生之前),并等待通过今晚的通宵处理来查看结果。

标签: ruby-on-rails multithreading heroku sidekiq


【解决方案1】:

我相信我已经找到了答案:config.threadsafe!,但我还没有找到。我现在已经这样做了,如果不是全部的话,大多数错误都消失了。参考:http://guides.rubyonrails.org/configuring.htmlhttp://m.onkey.org/thread-safety-for-your-rails(尤其是“Ruby's require is not atomic”部分)。

【讨论】:

  • 这方面有什么进展吗?我也看到了同样的问题,我很确定这与我的应用程序被标记为线程安全的事实有关。不过,我宁愿不关闭该设置。
猜你喜欢
  • 2015-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-04
  • 2015-06-02
  • 2017-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多