Ruby on rails Rails 3.2.8在保存之前的型号在服务器负载较重的情况下无法正常工作

Ruby on rails Rails 3.2.8在保存之前的型号在服务器负载较重的情况下无法正常工作,ruby-on-rails,ruby,activerecord,ruby-on-rails-3.2,ruby-1.9.3,Ruby On Rails,Ruby,Activerecord,Ruby On Rails 3.2,Ruby 1.9.3,几天前,我们的网站出现了流量高峰。当我们扩大规模以处理负载时,我们的单个服务器已达到最大值,请求开始超时。在此期间,一些请求仍在创建记录。问题来自以下模型: class List < ActiveRecord::Base before_save :set_published_at def set_published_at if published? && published_changed? self.published_at = Time.no

几天前,我们的网站出现了流量高峰。当我们扩大规模以处理负载时,我们的单个服务器已达到最大值,请求开始超时。在此期间,一些请求仍在创建记录。问题来自以下模型:

class List < ActiveRecord::Base
  before_save :set_published_at
  def set_published_at
    if published? && published_changed?
      self.published_at = Time.now
    end
  end
end
类列表
出于某种原因,在此期间发布的一些列表发布了=true,但发布了=nil

在这个模型上还有许多其他回调和一个观察者,但它们都不会影响已发布的_at属性。这发生在集中在五分钟内的五张唱片上


published_at属性如何为null,并且模型仍然以published=true保存?

可能是由于某种原因
published?&&已发布的\u已更改?
在重负载下评估为
false

不是答案,但为什么不对已发布的\u at字段进行验证以确保其存在?这可能有助于找到它。在编写此文件时,似乎没有必要添加验证,因为它是由代码在保存前设置的(在发生此事件之前是可靠的)。它不会再次更新,用户无法编辑。存在验证以确保您的数据不会不一致,而不仅仅是确保用户不会输入错误数据!:)我认为存在验证是为了提供有用的错误消息,存在数据库约束是为了保持数据一致我明白了。但为了进一步说明这一点,如果在保存之前我不能依赖,为什么我要依赖验证呢?我真的很想了解这件事是怎么发生的,而不是在发生的时候掩盖和拒绝。这是公平的!但数据库约束也可以解决这个问题。无论如何你应该能够期待它运行;我从未见过它失败,即使是在高负载下。这可能是问题所在,但为什么?那这个问题怎么能避免呢?哦,我明白了——我错过了你原来问题中关于published=true的内容。数据库(独立于rails)是否默认设置为have published=true,和/或基于其他条件?是否有可能代码中的其他内容在事实发生后为niling published_at,或者在事实发生后将published设置为true?不,没有其他地方将published_设置为。我看到的唯一可能性是某种异步保存问题,但乐观的锁定和验证应该可以防止这种情况。