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,有機率出現慢的狀況。具體緣由待分析。(最後定位到是rediscluster庫的問題,在redis服務端超時斷口鏈接後,客戶端會進行初始化,並且多協程下沒有鎖)
1. 數量大的狀況下(大於20),屢次訪問redis io,還不如連表從數據庫獲取數據