Rails 怎样提高一个写入数据非常频繁的 API 接口的并发处理性能?

wfwdex · 2017年06月30日 · 最后由 wfwdex 回复于 2017年06月30日 · 6939 次阅读

目前项目里有一个日志接口写入非常频繁,目前自己做过 AB 压力测试,在请求数为 10000,并发数为 100 的情况下,Requests per second 只能达到 36/s,期望能达到 100/s 以上。

这种情况下如果把这个接口的请求送入队列,比如 sidekiq,然后用队列的多线程去写入是不是一个可行的方案?有没有什么弊端?

或者有没有更好的方法去优化?

具体问题具体分析,可以先分析一下 qps 这么低的瓶颈是什么。

u1440247613 回复

请问用什么方法具体去分析?

可以找个 apm 工具

wootaw 回复

好的,我来找个试试,在这之前我先优化一下表的索引,把不必要的去掉,多谢。

异步批量写入。弊端是自己要做校验,处理一些失败或者异常情况

不要用 active record 就可以快很多了,或者现写到内存里,到一定量再倒入数据库

为什么不直接塞到 redis 呢

描述还是不够详细,决定你插入并发的有很多原因:

  1. 本身那个功能的写入效率就很差(给数据)
  2. 写入动作会涉及到共享区域,导致并发的时候锁行,例如:更新 Counter Cache 字段
  3. 其他 N 多种可能性

日志可以先写内存再 bulk insert

hooopo 回复

多谢,我本来还打算用队列,看来还是要手动处理比较好,bulk insert 肯定比队列还要快,感觉这样可行,我先试试这样,再次感谢。

huacnlee 回复

这个表比较独立,除了查询时有关联(比如关联用户),没有涉及到 回调 或者 更新 Counter Cache 字段 这样的动作,我先按 @hooopo 的方案改一下试试,多谢。

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