摘要:引子最近負責的一個消息推送系統要上線了,性能方便要滿足兩個要求對外提供的接口能達到條的。計劃,優點是使用做緩存層,再通過計劃任務從中取數據進行批量入庫,接口只操作,性能沒問題,批量入庫大大減輕了數據庫壓力。
引子
最近負責的一個消息推送系統要上線了,性能方便要滿足兩個要求
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、查詢慢的問題基本解決,后續再根據實際情況看是否需要繼續優化,優化方向:表分區、分庫分表。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/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民工」,雖然行業內巨大的人才需求和相對容易得到的高薪在源源不斷的吸引各路人馬加入,但它依...
閱讀 1381·2021-09-22 10:02
閱讀 1861·2021-09-08 09:35
閱讀 4044·2021-08-12 13:29
閱讀 2594·2019-08-30 15:55
閱讀 2256·2019-08-30 15:53
閱讀 2294·2019-08-29 17:13
閱讀 2752·2019-08-29 16:31
閱讀 2947·2019-08-29 12:24