最近遇到一个项目。老系统是用 java 的。整点大概有 6000 - 10000 左右的样子做同一个操作。现在准备要用 rails 来重写这块的东西, 对于高并发的处理不是很懂。 希望能得到处理这方面的高人指点下迷津。感谢!
系统是负载的,有 3 太服务器跑。都是 8 核 16g 内存。。数据库另外的服务系统, 同一时间检索同一数据表做查询。。跟插入。。, 现在老系统已经不行了。。
同样的业务 Java 顶不住,换 ruby 只能加更多的服务器,虽然代码简洁但是成本并没有降低,Ruby 处理这个场景没有比 Java 更好的性能优势和成本优势。
如果需要实时处理建议用 golang 重写或在 Java 基础上再优化,否则如果不需要实时可以考虑 sidekiq golang 版去处理
不要认为说单个请求的响应足够快好了,并发的时候和你单个请求的时候完全不一样的,会有很多问题。
例如:
rails 做到 10000 QPS
需要
gems
and rails middleware
换 rack + sequel 吧,rails 只能堆机器 + 各种优化来弥补性能上的损失
不要引入 active X 系列 activemodel activerecord activesupport
太占内存,rails 系列,随便一个进程 150M+ 内存是无压力的,代码质量差点,跑的时间久点,内存是会涨的,300M,500M/进程 无压力。
查询加缓存
非必要实时写入 (指你当前时段写入的数据,在本次并发查询【一定】不会用到),可以考虑做延迟写入; 如果 DB 是 mysql,精通 mysql 的话,可以自己做 binlog 收集及批量导入,不精通就算了,风险指数略高。
rack + sequel + puma 多 worker,在目前公司项目中,内存 50M 一个进程,几月稳定跑,进程不假死,内存固定不涨,不能说太多,说多了算是在黑 Rails 了。
这样想想,如果从语言和框架分析,干脆继续从 java 方向优化,性能也许比 rack 要好。比如,用适应高并发的 java 框架。