Rails mongoid rails thread safe 相关资料

putty · 2014年04月11日 · 最后由 lgn21st 回复于 2014年11月06日 · 2435 次阅读

最近新加一个虚拟币的功能,突然想到如下问题:

  1. 求 mongoid automic update,thread safe 相关资料
  2. rails controller/model 中的函数是否是 thread safe 的?

咩人知道?

跟你用的 Rails 版本有关,如果是 Rails 4.0 以上,Rails 默认工作在 threadsafe 模式下。

@lgn21st O(∩_∩)O 谢谢你的回复,让我有理由继续深究下去了。 现在把我的深究思绪整理下发出来,如果有错误请大家帮忙指正 rails threadsafe 只是说每个 Rails App instances 互不相关。 比如 Passenger 配置 worker_processes=5 的话,那么就会同时启动 5 个 Rails App instance。 此时有 http request 的话就会有一个 process 来处理,直到用完 5 个 instance,其它的 http request 就只能等 5 个 instance 有空闲的再来处理了。 而我担心的问题是如果同时来多个 request,同时要购买一个物品,先查询后扣取 (本例使用 mongoid,如果不够钱提示扣取失败),此时怎么保证数据的一致性呢,后来去 mongoid.org 上找到http://mongoid.org/en/mongoid/docs/querying.html#find_and_modifyatomic确定了可以通过 operation find_and_modify,至此我的担心终于有结果。还是得非常感谢@lgn21st

#3 楼 @putty 我觉得你把好几个问题杂糅在一起看了。

首先,基于 Rails 的部署方案有基于进程模型(unicorn or passenger)和基于线程模型(puma)两种。不管哪种模型,从 Rails 4 开始,使用一套自己实现的 ActiveSupport::Dependiecies 以及一系列组件,用于解决了 Ruby 原生的 Autoload 在多线程情况下的载入冲突问题,确保 Rails 在 threadsafe 模式下正常工作,具体可以看 http://tenderlovemaking.com/2012/06/18/removing-config-threadsafe.html

其次,不管是基于进程,还是线程,都有一个请求队列,保存未处理的请求。

最后,你说的购买问题,正如你找到的方案,在持久层面处理资源访问的一致性问题。并发的时候,其他请求可能会读到未更新的数据,但是写入的时候应该使用由数据库提供的事务机制或者锁机制确保一致性。

@lgn21st 茅塞顿开~~

需要 登录 后方可回复, 如果你还没有账号请 注册新账号