1. 程式人生 > >漫漫優化路,總會錯幾步(記一次接口優化)

漫漫優化路,總會錯幾步(記一次接口優化)

分鐘 線程 優化 並發 pipelined 分享 機器 info 有用

最近做了一個搜索接口的優化,反復壓測了四次,終於達到要求了,記錄一下,晚上加個雞腿??

業務邏輯

從OpenSearch中檢索出數據,然後各種填充組裝數據,最後返回

邏輯看似很簡單,當初我也是這樣認為的,於是預估5天完成,最後前前後後開發、聯調、改bug直到上線差不多花了10天(當然這10天並不是只做這一件事情)

復雜在於影響返回結構的因素很多,排除問題需要檢查配置、檢查數據庫、檢查緩存、檢查OpenSearch、檢查代碼

言歸正傳,不管邏輯有多復雜,都不是你逃避問題的接口,更不是你不去優化的理由,這不是本文的重點,優化過程才是

要求,給APP提供的接口一般要求響應時間在100ms以內

第一次壓測

技術分享圖片

慘不忍睹,平均響應時間150ms,而且在這次壓測過程中還發現其它的問題,後臺報錯,經查是OpenSearch每秒查詢次數限制

優化代碼與配置

1、修改OpenSearch配置,並且將壓測環境中的OpenSearch連接地址改為內網地址

2、將代碼中循環查詢緩存的地方改為一次性批量查詢返回

3、和相關同學確認後去掉項目中無用的代碼

第二次壓測

技術分享圖片

雖然優化了代碼,修改了配置,但是情況更糟糕了,而且還改出了新的問題

當時,反復檢查了代碼,確定查詢緩存的次數已經是最少了,而且連接線程池相關參數也調到一個相對較大且合理的值了

如果,再壓測還是無法達到要求的話,只有出最後一招了:緩存結果集

即,以用戶ID和用戶搜索的關鍵詞為key,查詢的結果為value,緩存5分鐘

第三次壓測

技術分享圖片

總算符合要求了,並發60的時候響應時間達到32ms,而我又發現了新的優化點

技術分享圖片

接口中居然還有查數據庫的操作,這可不能忍,排查之後去掉了一些不必要的依賴

成長

學會了使用RedisTemplate的executePipelined進行redis批量查詢

技術分享圖片

針對本次優化的總結

1、一定要絕對避免循環查數據庫和緩存(PS:循環裏面就不能有查詢緩存,更不能有查詢數據庫的操作,因為循環的次數沒法控制)

2、對於API接口的話,一般都是直接查緩存的,沒有查數據庫的

3、多用批量查詢,少用單條查詢,盡量一次查出來

4、對於使用阿裏雲,要留意一下相應產品的配置,該花的錢還是得花,同時,千萬要記得正式環境中使用相應產品的內網地址

5、註意連接池大小(包括數據庫連接池、Redis緩存連接池、線程池)

6、壓測的機器上不要部署其它的服務,只跑待壓測的服務,避免受其它項目影響;對於線上環境,最好一臺機器上只部署一個重要的服務

7、沒有用的以及被註釋掉的代碼,沒有用的依賴最好及時清理掉

8、集群自不用說

9、一些監控類的工具工具可以幫助我們更好的定位問題,比如鏈路跟蹤,這次項目中使用了PinPoint

10、如果技術上優化的空間已經非常小了,可以試著從業務上著手,用實際的數據說話,可以從日常的訪問量,歷史訪問量數據來說服測試

11、每一次代碼改動都有可能引入新的問題,因此,每次修改代碼後都要回歸測試一下(PS:每次修改完以後,我都會用幾組不同的關鍵詞搜索,然後比對修改前和修改後返回的數據是否一致,這個時候postman,以及Beyond compare就派上用場了)

12、關鍵的地方一定要多加點兒日誌,方便以後排除問題,因為排查線上問題最主要還是靠日誌

漫漫優化路,總會錯幾步(記一次接口優化)