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

wfwdex · 发布于 2017年06月30日 · 最后由 wfwdex 回复于 2017年06月30日 · 568 次阅读
19842

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

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

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

共收到 11 条回复
20690

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

19842
20690u1440247613 回复

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

7809

可以找个 apm 工具

19842
7809wootaw 回复

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

2a6d47

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

3126

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

17671

为什么不直接塞到redis呢

De6df3

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

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

日志可以先写内存再bulk insert

19842
8hooopo 回复

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

19842
De6df3huacnlee 回复

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

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