Ruby on rails 多个Unicorn实例(Rails)中的竞争条件

Ruby on rails 多个Unicorn实例(Rails)中的竞争条件,ruby-on-rails,nginx,concurrency,Ruby On Rails,Nginx,Concurrency,假设我有一个控制器动作,它需要花费很多时间来执行,并且在这两个动作之间执行几个数据库操作,而且它们只有在整个动作是原子的情况下才能正常工作 如果我有多个应用程序实例分布在多个服务器上,使用一个Nginx平衡加载程序,换句话说,如果两个请求同时命中,它们将由两个不同的服务器同时开始处理 在这种情况下,有什么方法可以避免比赛条件出现问题?这看起来像是任何分布式应用程序都会遇到的问题 假设我有一个控制器操作,它需要花费很多时间来执行,并且在这两个操作之间执行几个数据库操作,而且它们只有在整个操作是原子

假设我有一个控制器动作,它需要花费很多时间来执行,并且在这两个动作之间执行几个数据库操作,而且它们只有在整个动作是原子的情况下才能正常工作

如果我有多个应用程序实例分布在多个服务器上,使用一个Nginx平衡加载程序,换句话说,如果两个请求同时命中,它们将由两个不同的服务器同时开始处理

在这种情况下,有什么方法可以避免比赛条件出现问题?这看起来像是任何分布式应用程序都会遇到的问题

假设我有一个控制器操作,它需要花费很多时间来执行,并且在这两个操作之间执行几个数据库操作,而且它们只有在整个操作是原子的情况下才能正常工作

如果争用条件是由数据库操作引起的,那么一种解决方案是包装那些将确保属性的操作

在Rails中,您可以按如下方式通过活动记录事务进行操作:

ActiveRecord::Base.transaction do
  database operation 1
  database operation 2
  ...
end
请注意,每个数据库连接都会执行活动记录事务。如果您想包装多个ActiveRecord类,这些类又存储在多个数据库中,那么一种解决方法是嵌套事务

Class1.transaction do 
  Class2.transaction do
     database operation 1
     database operation 2
  end
end
但这似乎不是一个优雅的解决方案。更多关于

假设我有一个控制器操作,它需要花费很多时间来执行,并且在这两个操作之间执行几个数据库操作,而且它们只有在整个操作是原子的情况下才能正常工作

如果争用条件是由数据库操作引起的,那么一种解决方案是包装那些将确保属性的操作

在Rails中,您可以按如下方式通过活动记录事务进行操作:

ActiveRecord::Base.transaction do
  database operation 1
  database operation 2
  ...
end
请注意,每个数据库连接都会执行活动记录事务。如果您想包装多个ActiveRecord类,这些类又存储在多个数据库中,那么一种解决方法是嵌套事务

Class1.transaction do 
  Class2.transaction do
     database operation 1
     database operation 2
  end
end

但这似乎不是一个优雅的解决方案。更多关于

添加到Son Nguyens答案中,我想提到的是,除了数据库事务之外,在执行长时间运行的流程时锁定特定记录或集合通常也很有帮助

ActiveRecord同时支持和锁定,但根据我的经验,悲观锁定在这种情况下通常更健壮


进一步注意,根据实际操作所需的时间,通常最好使用或类似的功能将处理移到后台。非常长时间运行的请求,除了UX较差外,通常还需要在web服务器上进行特殊配置。Heroku甚至在30秒后停止处理请求。

除了Son Nguyens的回答之外,我想提到的是,除了数据库事务之外,在执行长时间运行的流程时锁定特定记录或集合通常也很有帮助

ActiveRecord同时支持和锁定,但根据我的经验,悲观锁定在这种情况下通常更健壮


进一步注意,根据实际操作所需的时间,通常最好使用或类似的功能将处理移到后台。非常长时间运行的请求,除了UX较差外,通常还需要在web服务器上进行特殊配置。Heroku甚至在30秒后停止处理请求。

谢谢!嗯,这个过程一点也不长,但足够长,可以满足比赛条件(0.001ms、0.1ms、2ms、1ms等)。(还有,谁在Heroku上部署了严肃的应用程序?:)…)。你提到的那个锁定系统正是我想要的。现在,我想知道在Express(Node)和其他似乎没有这种功能的框架中是如何实现这种功能的……行锁定是许多ORM支持的数据库功能。乐观锁定也是如此。例如,JavasHibernate和PHPs。在Node.js上有Sequelize,它似乎也有完整的事务和锁定支持(还没有使用过),谢谢!嗯,这个过程一点也不长,但足够长,可以满足比赛条件(0.001ms、0.1ms、2ms、1ms等)。(还有,谁在Heroku上部署了严肃的应用程序?:)…)。你提到的那个锁定系统正是我想要的。现在,我想知道在Express(Node)和其他似乎没有这种功能的框架中是如何实现这种功能的……行锁定是许多ORM支持的数据库功能。乐观锁定也是如此。例如,JavasHibernate和PHPs。在Node.js上有Sequelize,它似乎也有完整的事务和锁定支持(还没有使用它)