摘要:引子最近负责的一个消息推送系统要上线了,性能方便要满足两个要求对外提供的接口能达到条的。计划,优点是使用做缓存层,再通过计划任务从中取数据进行批量入库,接口只操作,性能没问题,批量入库大大减轻了数据库压力。
引子
最近负责的一个消息推送系统要上线了,性能方便要满足两个要求
1、对外提供的接口能达到5w条/s的tps。
2、查询功能和统计报表在数据量大的情况下要保证速度。
项目环境:
linux+tomcat8+mysql8+redis+rocketmq
1、接口优化
接口状况:http接口,接收到短信数据库后,先进行用户身份、用户余额、黑名单、敏感词等校验,校验完成后,插入到mysql数据库。然后通过计划任务从数据库中查询出待发送的短信数据,推送到mq,发送子系统负责从mq中消费短信数据发送到运营商网关。
压测的时候发现,只能达到15条/s的tps,离5w这个目标差十万八千里。
问题分析:
校验的时候都是从redis里面取的数据,问题应该不大,那就剩下一个插入数据的操作了,刚好测试那边也反馈了数据库cpu占用100%,那么基本确定性能瓶颈就在插入数据库这里。
<<优化思路>>
当时想到两个解决办法:
a、接口接收到数据后,校验通过,直接发送mq,消息推送系统和发送子系统同时去消费,一边入库一边发到运营商网关。
b、接口接收到数据后,校验通过,先保存到redis中,再用一个计划任务轮询redis去批量入库。
批量入库参考:https://www.cnblogs.com/caica...
a计划,优点是短信数据很快的就发送到运营商网关,用户能够很快的收到。缺点就是,第一如果发送子系统已发送完毕,状态报告返回时,短信数据还没入库,这时候就比较蛋疼了。第二数据入库还是单条,数据库压力仍然很大,影响其他功能的使用。
b计划,优点是使用redis做缓存层,再通过计划任务从redis中取数据进行批量入库,接口只操作redis,性能没问题,批量入库大大减轻了数据库压力。缺点是数据入库到发送到运营商网关会有几秒的延迟,还有就是批量入库失败,数据有丢失风险。
2、查询优化
短信查询功能,需要根据一些查询条件去查询短信的数据(分页查询),需要根据发送时间降序排列,还需要根据用户权限过滤,关联表有4张左右。600万条数据,需要几十秒的查询时间,崩溃。
<<优化思路>>
在查询条件字段和排序字段加上索引,减少几张关联表(数据量很少几十条的样子,如果关联进去是用来做查询条件,可以用exists来替代,如果是用来查询某个字段的,可以在取到结果集后,再去多带带查一下这个字段),优化后,0.004秒搞定。然后又发现翻页的时候,查询总数速度慢、还有查询页数越大越慢的问题。
总数慢的问题解决:count(1),count(*),count(字段)这几种方式都试了,没用啊,后面发现单表count快,多表就慢,于是只count一张表,其他表主要是做查询条件的,使用exists的方式改写,问题解决。
翻页慢的问题解决:越往后面翻页就越慢,最后一页要80多秒,使用的limit m,n来分页的,幸好有大神详细分析了这个问题,博客地址:https://www.cnblogs.com/genin...
后记1、单机压测最终能达到5000条/s的tps,离目标5w/s的距离仍有一定距离,但是可以通过集群部署的方式来弥补。后续优化方向,增加nginx配置长连接、使用undertow服务器替换tomcat服务器,使用netty重新开发短信发送接口等。
2、查询慢的问题基本解决,后续再根据实际情况看是否需要继续优化,优化方向:表分区、分库分表。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/76945.html
摘要:由于不是线程安全的,故在方法上增加了同步操作,造成竞争等待。至此,整个多线程调优结束,通过充分优化同步竞争的方式,最终使得分线程记录日志的性能比最原始的多线程写同一文件提高了倍去锁提高到倍,替换提高倍 背景 在一次项目的性能调优中,发现出现竞争瓶颈,导致在资源未使用满的情况下,TPS已经无法提升。祭起JMC(JAVA MISSON CONTROL)飞行记录器大法后,发现线程集中等待...
摘要:相对于电子书,我更喜欢纸质版的书籍。过去的年一共阅读过本技术书,下面对这些书做一个小结。源码深度解析这本书是年购买的,年是第四次阅读。必知必会数据库的复习书籍,内容浅显易懂。 相对于电子书,我更喜欢纸质版的书籍。我喜欢在拿到新书时记录购买时间、地点、开始阅读的时间、第一次看完的时间,算是一种学习的记录。过去的2016年一共阅读过15本技术书,下面对这些书做一个小结。 《深入理解Java...
摘要:前言这篇文章的主题是记录一次程序的性能优化,在优化的过程中遇到的问题,以及如何去解决的。因为我们的连接数只有,一旦请求过多,势必会导致数据库瓶颈。我们再次压测,结果显示万,服务器数据库连接正常,连接正常,响应时间平均为,错误率为。 前言 这篇文章的主题是记录一次Python程序的性能优化,在优化的过程中遇到的问题,以及如何去解决的。为大家提供一个优化的思路,首先要声明的一点是,我的方式...
摘要:而在新一线城市序列,个新一线城市的排名依次是成都杭州重庆武汉苏州西安天津南京郑州长沙沈阳青岛宁波东莞和无锡。 showImg(https://segmentfault.com/img/remote/1460000018784418?w=640&h=419); IT行业的技术者,时常被我们戏称为「IT民工」,虽然行业内巨大的人才需求和相对容易得到的高薪在源源不断的吸引各路人马加入,但它依...
阅读 1360·2021-09-22 10:02
阅读 1796·2021-09-08 09:35
阅读 3983·2021-08-12 13:29
阅读 2566·2019-08-30 15:55
阅读 2240·2019-08-30 15:53
阅读 2272·2019-08-29 17:13
阅读 2700·2019-08-29 16:31
阅读 2929·2019-08-29 12:24