分享---rpc運維事故處理

事故案例03 - Qserver RPC調用大量失敗

一、事故背景

Queryserver是內部的核心服務,負責處理數據查詢請求并支持分布式緩存功能。為優化緩存一致性,新增了分布式鎖邏輯:在查詢請求命中緩存時需先獲取分布式鎖(基于Tair實現),若未獲取成功則等待1秒后重試。此功能上線后,在特定異常場景下(如SQL執行失敗)觸發了線程池資源耗盡,最終導致RPC請求被拒絕,引發服務故障。

二、事故影響

(一)業務影響

  • 線上部分數據查詢失敗,直接影響依賴Queryserver的業務功能(如Mustang、malldatacentor服務)。
  • 因故障快速修復(總影響時長19分鐘),未造成大規模客戶投訴,但存在潛在業務中斷風險。
  • 某日線上出現RPC失敗率突增,導致部分業務數據無法展示。

(二)技術影響

  • 告警顯示上游服務調用Queryserver的RPC失敗率超過50%,Queryserver的RPC線程池持續滿載,觸發RejectedException(服務端線程池拒絕請求),服務可用性下降。
  • 失敗請求均勻分布,無明顯業務流量突增或數據庫負載異常,即Doris引擎負載無顯著波動,故障范圍集中在Queryserver自身邏輯。

三、根本原因

(一)直接原因

分布式鎖邏輯在高并發場景下導致RPC線程池耗盡,RPC框架主動拒絕請求(RejectedException)。

(二)深層原因

1. 邏輯設計缺陷
  • 查詢失敗時未緩存結果,后續相同請求持續觸發分布式鎖競爭,強制串行執行,占用線程資源。
  • 分布式鎖重試間隔過長(1秒),導致線程長時間阻塞,加速線程池耗盡。
2. 異常處理不足

未對失敗查詢的請求進行熔斷或限流,異常流量持續沖擊線程池。

3. 測試覆蓋不全

未模擬“高并發異常SQL”場景,導致邏輯缺陷未在測試階段暴露。

四、處理流程與數據變化

(一)處理流程

  • 16:16:收到raptor持續告警,確認Mustang/malldatacentor服務異常。
  • 16:17:通過鏈路追蹤定位到Queryserver RPC失敗率異常。
  • 16:28:嘗試重啟服務,但未解決問題。
  • 16:32:深入分析代碼邏輯,發現分布式鎖機制導致線程池滿載,臨時關閉緩存功能或調整鎖等待時間。
  • 16:35:告警恢復,服務可用性回升。

(二)關鍵數據變化

指標故障前故障中恢復后
Queryserver QPS正常驟降(拒絕請求)正常
RPC失敗率<1%>50%<1%
線程池使用率60%100%60%
Tair鎖競爭頻率高頻(持續重試)

五、過程復現

(一)原因定位

queryserver添加了分布式鎖的功能,如果開啟了緩存的情況下,每個查詢需要去拿到分布式鎖之后,才能被執行,否則會等待1s時間再去嘗試拿到分布式鎖。代碼如下:

while (true) {if (!cacheInfo.isUpdateCache()) {//1 從緩存中獲取結果CachedResult cachedResult = cacheService.getResult(sqlMappingKey);if (cachedResult!= null) {
//                logInfo.setHitCache(true);detailLog.setUseCache(cacheInfo.isFetchFromCache());return ResponseContext.success(cachedResult.getData()).hitCache().withAttach(detailLog);}}//加鎖if (!tairService.setNx((LOCK_PREFIX + sqlMappingKey).getBytes(), ("" + id).getBytes(), 20)) {Thread.sleep(1000);continue;}//2 從引擎中查詢List result = queryEngineBackend.syncQuery(queryInfo);//3 對結果進行緩存if (result!= null &&!result.isEmpty()) {//這里最終判斷傳入的緩存過期時間是否合法,如果不合法就傳入默認的1800s.最長時間不超過60天cacheService.cacheResult(sqlMappingKey, result, ((cacheInfo.getExpireMs() > 0) && (cacheInfo.getExpireMs() < MAX_EXPIRE_SEC))? cacheInfo.getExpireMs() : DEFAULT_EXPIRE_SEC);}//解鎖if (("" + id).equals(new String(tairService.getValue((LOCK_PREFIX + sqlMappingKey).getBytes()))))tairService.delete((LOCK_PREFIX + sqlMappingKey).getBytes());return ResponseContext.success(result).withRequestId(id).withAttach(detailLog);
}

并且如果查詢失敗的話,不會緩存SQL結果,后續的相同請求均會提交到引擎執行,而后續的請求如果全是有問題的SQL,則會占用請求線程,并且將查詢變為串行執行。

(二)復現過程

通過監控發現,RPC線程池使用率在故障期間持續100%,隊列堆積后觸發拒絕策略。

復現實驗:構造高并發異常SQL請求,線程池在10秒內被打滿,完全復現線上問題。

  1. 在Mustang上配置一個帶有緩存功能的SQL,然后SQL故意寫成執行會報錯的SQL。
  2. 在st環境使用工具并發請求,查看queryserver報錯信息。

實驗結果如下:

  1. queryserver大量出現RPC請求被拒絕,出現很多com.dianping.pigeon.remoting.provider.exception.ProcessTimeoutException異常。
  2. 上游調用出現失敗率較高的情況。

六、總結與改進方案

(一)深層次原因分析

1. 架構設計缺陷
  • 資源競爭模型不合理:
    • 分布式鎖重試機制采用同步阻塞(Sleep),違背高并發服務的異步化設計原則。
    • 未隔離線程池:鎖競爭、SQL查詢、緩存操作共享同一線程池,異常SQL影響全局請求。
  • 緩存策略漏洞:
    • 僅緩存成功結果,未對失敗請求做短期標記(如“異常狀態緩存”),導致無效查詢重復執行。
2. 運維與監控盲區
  • 線程池狀態未監控:僅關注QPS和錯誤率,未實時跟蹤線程池使用率、鎖競爭耗時等指標。
  • 告警閾值不合理:RPC失敗率告警觸發閾值過高(>30%),未能提前預警。
3. 測試與流程問題
  • 異常場景覆蓋不足:壓力測試僅覆蓋正常SQL,未模擬高并發異常SQL場景。
  • 代碼評審遺漏:分布式鎖邏輯的Sleep操作在評審中未被質疑,團隊對阻塞風險認知不足。

(二)技術解決方案(面試重點)

1. 邏輯優化
  • 鎖重試異步化:
    • Thread.sleep(1000)改為異步等待(如基于CompletableFuture的調度),釋放線程資源。
    • 代碼示例:
if (!tairService.setNx(...)) { return CompletableFuture.delayedExecutor(100, TimeUnit.MILLISECONDS) .submit(() -> retryLockAndQuery()); 
}
  • 失敗結果緩存:
    • 對異常SQL結果緩存5秒,避免重復執行,代碼修改:
if (result == null) { cacheService.markError(sqlMappingKey, 5); // 標記異常狀態 
}
2. 架構增強
  • 線程池隔離:
    • 為鎖競爭、SQL查詢、緩存操作分配獨立線程池,避免相互影響。
  • 使用Netty或Vert.x實現異步RPC框架,提升吞吐量。
3. 熔斷與限流
  • 集成Hystrix,對異常SQL請求熔斷(10秒內錯誤率>50%則直接拒絕)。
  • 為單SQL設置QPS限流(如每秒100次),防止資源耗盡。
4. 監控與運維改進
  • 新增監控指標:
    • 線程池使用率、鎖競爭耗時、Tair操作成功率。
    • 通過Prometheus + Grafana實時展示,閾值觸發企業微信告警。
  • 混沌測試常態化:
    • 定期注入線程池滿載、分布式鎖失效等故障,驗證服務自愈能力。

七、后續計劃

  • 灰度發布改進后的分布式鎖邏輯,驗證異常場景下的線程池穩定性。
  • 完善自動化測試平臺的異常注入能力(如模擬SQL失敗、線程池滿載)。
  • 建立服務健康度評分體系,將線程池狀態、鎖競爭等指標納入服務可用性評估。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/71945.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/71945.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/71945.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

string類詳解(下)

文章目錄 4. string類的模擬實現4.1 構造 析構4.2 c_str4.3 下標遍歷4.4 迭代器4.5 插入4.6 刪除4.7 查找4.8 賦值4.9 交換4.10 提取子串4.11 比較大小4.12 流插入 && 流提取 5. 現代版寫法的String類5.1 完整代碼 6. 寫時拷貝&#xff08;了解&#xff09; 4. string…

win11本地部署deepseek大模型(安裝ollama+docker+open-webui)最終實現自己的項目可通過API調用投喂數據后的模型

硬件配置&#xff1a;筆記本win11&#xff0c;內存32G&#xff0c;CPU銳龍7 &#xff0c;無獨顯&#xff1b;只能考慮deepseek-r1:1.5b模型。 第一步&#xff1a;安裝Ollama 此處不過多累贅了&#xff0c;https://ollama.com/官網選擇對應的系統版本下載即可。 需要注意的是…

WebSocket簡單介紹 并接入deepseek

目錄 什么是 WebSocket&#xff1f;工作原理&#xff1a; 為什么需要 WebSocket&#xff1f;WebSocket 的優勢HTTP 和 WebSocket 的區別WebSocket 的劣勢WebSocket 的應用場景WebSocket 握手過程1. 客戶端發起握手請求2. 服務器響應握手請求3. 建立連接 WebSocket 事件處理WebS…

虛擬機安裝教程

一、軟件下載與安裝 運行安裝程序: 雙擊下載的.exe文件&#xff0c;運行安裝程序。 按照安裝向導的提示進行操作。 通常情況下&#xff0c;你需要接受許可協議&#xff0c;選擇安裝目錄&#xff08;建議使用默認路徑&#xff0c;除非你有特殊需求&#xff09;&#xff0c;并選…

order by布爾盲注、時間盲注

pdo防御下&#xff0c;order by、limit不能參數綁定&#xff0c;可以進行sql注入 案例&#xff1a;靶場的less-46 布爾盲注&#xff1a; import requests from lxml import htmldef get_id_one(URL, paload):res requests.get(urlURL, paramspaload)tree html.fromstring(…

springboot集成deepseek4j

1、文檔地址 快速開始 - 零基礎入門Java AI 免費的模型 Models 2、pom文件依賴 parent依賴 <dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.12.0</version></dependency>&…

Visual Studio Code 跨平臺安裝與配置指南(附官方下載鏈接)

一、軟件定位與核心功能 Visual Studio Code&#xff08;簡稱VS Code&#xff09;是微軟開發的開源跨平臺代碼編輯器&#xff0c;支持超過50種編程語言的智能補全、調試和版本控制功能。2025版本新增AI輔助編程模塊&#xff0c;可自動生成單元測試代碼和API文檔注釋。 二、下載…

elementplus點擊按鈕直接預覽圖片

引用&#xff1a;https://blog.csdn.net/this_zq/article/details/134535539 <el-image-viewerv-if"showImagePreview":zoom-rate"1.2"close"closePreview":url-list"imgPreviewList"/>const showImagePreview ref(false) cons…

grafana K6壓測

文章目錄 install and runscript.jsoptions最佳實踐 report 解析 https://grafana.com/docs/k6/latest/get-started install and run install # mac brew install k6當前目錄下生成壓測腳本 # create file script.js k6 new [filename] # create file ‘script.js’ in …

解決IDEA使用Ctrl + / 注釋不規范問題

問題描述&#xff1a; ctrl/ 時&#xff0c;注釋縮進和代碼規范不一致問題 解決方式 設置->編輯器->代碼樣式->java->代碼生成->注釋代碼

項目實踐 之 pdf簡歷的解析和填充(若依+vue3)

文章目錄 環境背景最終效果前端講解左側模塊解析右側上傳模塊解析前端步驟 后端講解代碼前端 環境背景 若依前后端分離框架 vue最后邊附有代碼哦 最終效果 前端講解 左側模塊解析 1、左側表單使用el-form 注意&#xff1a; 1、prop出現的字段&#xff0c;需要保證是該類所…

【Electron入門】進程環境和隔離

目錄 一、主進程和渲染進程 1、主進程&#xff08;main&#xff09; 2、渲染進程&#xff08;renderer&#xff09; 二、預加載腳本 三、沙盒化 為單個進程禁用沙盒 全局啟用沙盒 四、環境訪問權限控制&#xff1a;contextIsolation和nodeIntegration 1、contextIsola…

如何看待 Kaiming He 最新提出的 Fractal Generative Models ?

何愷明團隊提出的分形生成模型(Fractal Generative Models) 引發了廣泛關注,其核心思想是通過遞歸調用生成模型模塊構建自相似結構,類似數學中的分形概念(如雪花結構),從而高效生成高分辨率數據(如圖像)。 Fractal Generative Models即分形生成模型,是一種新型的生成…

Debian系統終端輸入ifconfig報錯

報錯 bash: ifconfig: command not found 原因 Debian 上默認不安裝 ifconfig 軟件包。這是因為 ifconfig 已被棄用&#xff0c;取而代之的是新的 ip 命令。該 ip 命令現在負責修改或顯示路由、網絡設備、接口和隧道 如果仍然想使用舊的 ifconfig 命令&#xff0c;則必須顯式…

【NLP 27、文本分類任務 —— 傳統機器學習算法】

不要抓著枯葉哭泣&#xff0c;你要等待初春的新芽 —— 25.1.23 一、文本分類任務 定義&#xff1a;預先設定好一個文本類別集合&#xff0c;對于一篇文本&#xff0c;預測其所屬的類別 例如&#xff1a; 情感分析&#xff1a; 這家飯店太難吃了 —> 正類 …

Lumoz Chain正式上線:AI 時代的新算力破局者

新的敘事和技術突破永遠是推動行業前行的核心動力。當下&#xff0c;AI Agent無疑是最炙手可熱的賽道之一。 當加密世界將目光投向AI領域時&#xff0c;大多數項目仍停留在以AI為工具或應用場景的層面&#xff0c;試圖通過集成AI模型或優化鏈上功能來吸引用戶。然而&#xff0c…

Python - Python連接數據庫

Python的標準數據庫接口為&#xff1a;Python DB-API&#xff0c;Python DB-API為開發人員提供了數據庫應用編程接口。 PyMySQL 是在 Python3.x 版本中用于連接 MySQL 服務器的一個實現庫&#xff0c;Python2中則使用mysqldb。 PyMySQL 遵循 Python 數據庫 API v2.0 規范&…

面試八股文--數據庫基礎知識總結(1)

1、數據庫的定義 數據庫&#xff08;DataBase&#xff0c;DB&#xff09;簡單來說就是數據的集合數據庫管理系統&#xff08;Database Management System&#xff0c;DBMS&#xff09;是一種操縱和管理數據庫的大型軟件&#xff0c;通常用于建立、使用和維護數據庫。數據庫系統…

關于在java項目部署過程MySQL拒絕連接的分析和解決方法

前言 在最近一次部署項目一次項目部署過程中&#xff0c;由于沒有對MySQL數據庫的部分權限和遠程連接進行授權&#xff0c;導致了在執行項目功能API時&#xff0c;出現MySQL連接異常或MySQL拒絕連接的問題。 問題 以下是部分報錯截圖&#xff1a; 分析 根據日志提示&#xf…

PhotoLine綠色版 v25.00:全能型圖像處理軟件的深度解析

在圖像處理領域,PhotoLine以其強大的功能和緊湊的體積,贏得了國內外眾多用戶的喜愛。本文將為大家全面解析PhotoLine綠色版 v25.00的各項功能,幫助大家更好地了解這款全能型的圖像處理軟件。 一、迷你體積,強大功能 PhotoLine被譽為迷你版的Photoshop,其體積雖小,但功能卻…