新手问题 Rails 并发疑问

abellong · 2014年12月11日 · 最后由 hhuai 回复于 2014年12月11日 · 3165 次阅读

关于 rails 并发,我所知道的一些知识:

  1. 平常开发应用时,运行 rails console 命令,使用了 WEBrick 服务器,它是纯 ruby 写的,一次只能处理一个请求
  2. 生产环境下,比如使用 Apache(或 Nginx)+Passenger,Apache 负责接受 http 请求,转给 Passenger 处理,Passenger 开 ruby 进程进行实际处理。我后台查看过,对于一个 app,貌似就开了两个 ruby 进程,多个设备多个浏览器独立访问,ruby 进程号和进程数量都没变化。

疑问:

  1. 是不是两个 ruby 进程意味着同时只能处理两个请求?
  2. 如果两个请求要同时写同一个数据库的同一张表,会怎样? 我遇到的例子:给某张表所有记录编一个号码(从 0 开始依次增大),如果中间某条记录删除,后续所有的记录编号都要减 1,两个用户同时做删除操作,会冲突吧?我猜测是对数据库的访问是一次只能处理一个请求,但不知道怎么验证;我们在开发 rails 应用时似乎不用考虑这样的问题,这种 “协调” 工作是交给谁来做的呢?
  3. 怎样评估某个应用使用 Apache+Passenger 部署在普通的 vps 上,能同时支持多少人并发访问?需要考虑哪些因素?有没有方法测试?
  1. 不是,进程之上可以使用多线程或者多路复用实现并发。rails 4.0 后支持多线程之后,多进程更多是为了绕过 gil 实现 smp。
  2. 数据库基础,去了解一下悲观锁
  3. 最简单的 ab,siege

#1 楼 @saiga 在用你做的主题 😃

WEBrick 也采用了多线程,经典的一来连接开一个线程那种

connect select { Thread process }

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