贴子详情接口偶发时延超过2s的问题

Posted xjng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了贴子详情接口偶发时延超过2s的问题相关的知识,希望对你有一定的参考价值。

1. 发现问题
    1. 查询慢access日志,发现偶尔有接口时延超过2s,发送概率1%左右
2. 排查
    1. 写单元测试,多次测试后,不能重现问题
    2. 接口代码里加日志,每隔一行代码加一次日志,等待重现
    3. 不断往上游接口加日志后,发现耗时在获取榜单top10的接口
    4. top10接口是从数据库获取top50的用户,然后通过多协程到redis里面获取用户信息
    5. 发现从数据库获取数据时,没索引,加上索引后,问题依然存在
    6. 再次加日志后发现耗时在多协程到redis里面获取用户信息
    7. 耗时细节:
        1. 接口共用时2.1s(正常只用0.2s)
        2. 获取日榜,10个用户,0.01s
        3. 获取周榜,50个用户,0.8s
        4. 获取总榜,50个用户,0.6s
        5. 再次获取总榜,50个用户(缓存不能命中,不知道为什么。不能命中是偶发),0.6s
    8. 原因分析:
        1. 只需要获取前10,但是获取了前50
        2. 上层业务只需要id,但是下层获取了用户信息,无谓操作,同时加剧了第一点
3. 优化方案:
    1. 从数据库获取前10
    2. 只获取id,不获取用户信息
    3. 获取id后,加一层缓存
    4. 原来的接口改为连表获取用户数据
4. 学习
    1. 多协程下,任务量较大情况下(大于20),访问redis,有概率出现慢的情况。具体原因待分析
    1. 数量大的情况下(大于20),多次访问redis io,还不如连表从数据库获取数据
 
 
 
 

以上是关于贴子详情接口偶发时延超过2s的问题的主要内容,如果未能解决你的问题,请参考以下文章

多亏了这几个工具,搞定了http接口偶发415的问题

应用偶发性连接不上Oracle数据库的排查案例

记一次Linux server偶发CPU飙升问题的跟进与解决

找水王

推荐几个我近期排查线上http接口偶发415时用到的工具

libcurl发起post请求时间延迟问题。except为空即可