Ruby on rails 多个Unicorn实例(Rails)中的竞争条件
假设我有一个控制器动作,它需要花费很多时间来执行,并且在这两个动作之间执行几个数据库操作,而且它们只有在整个动作是原子的情况下才能正常工作 如果我有多个应用程序实例分布在多个服务器上,使用一个Nginx平衡加载程序,换句话说,如果两个请求同时命中,它们将由两个不同的服务器同时开始处理 在这种情况下,有什么方法可以避免比赛条件出现问题?这看起来像是任何分布式应用程序都会遇到的问题 假设我有一个控制器操作,它需要花费很多时间来执行,并且在这两个操作之间执行几个数据库操作,而且它们只有在整个操作是原子的情况下才能正常工作 如果争用条件是由数据库操作引起的,那么一种解决方案是包装那些将确保属性的操作 在Rails中,您可以按如下方式通过活动记录事务进行操作:Ruby on rails 多个Unicorn实例(Rails)中的竞争条件,ruby-on-rails,nginx,concurrency,Ruby On Rails,Nginx,Concurrency,假设我有一个控制器动作,它需要花费很多时间来执行,并且在这两个动作之间执行几个数据库操作,而且它们只有在整个动作是原子的情况下才能正常工作 如果我有多个应用程序实例分布在多个服务器上,使用一个Nginx平衡加载程序,换句话说,如果两个请求同时命中,它们将由两个不同的服务器同时开始处理 在这种情况下,有什么方法可以避免比赛条件出现问题?这看起来像是任何分布式应用程序都会遇到的问题 假设我有一个控制器操作,它需要花费很多时间来执行,并且在这两个操作之间执行几个数据库操作,而且它们只有在整个操作是原子
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,它似乎也有完整的事务和锁定支持(还没有使用它)