第2章
燈下同謀1
志摘要,里面有一串并不顯眼的錯誤碼,但被標了紅色:REQ_CONS**TENCY_CHECK_FAILED。她把鼠標懸停在錯誤信息上,讀到系統(tǒng)提示:請求一致性校驗失敗。
“校驗失???”林知夏喃喃,“這個一般不是支付**問題,更像是請求參數(shù)在鏈路中被改寫或不一致?!?br>“所以我們懷疑是前端打包版本沒更新干凈?!毙「咴谂赃叢逶?。他說話時像在努力保持節(jié)奏,不想讓情緒帶亂邏輯,“但他們后端說接口兼容,應該沒問題?!?br>林知夏沒有立刻反駁。她看向更深層的內容:失敗用戶的請求里,某些字段值與服務端期待不匹配。最關鍵的是,有一部分用戶的字段看上去“來自同一批前端”,但也有一部分像是被重放過,或者在緩存里被保留了舊版本的格式。
“重放?”她皺眉。
“不是我們定義的那種重放攻擊?!迸赃呌腥苏f,是運維的老陳。他聲音低,帶著煙嗓卻沒有煙味,“更像是**緩存策略沒刷新。”
林知夏在腦內把可能性排了一遍。她知道“緩存沒刷新”通常會導致舊字段仍被用在新接口上,從而引發(fā)一致性校驗失敗。但這又解釋不了為什么“影響范圍在擴大”。如果只是少數(shù)老緩存命中,故障不該不斷擴張,除非某個新的觸發(fā)因素讓更多請求走進了緩存路徑。
她把面板往下拉,注意到一個偏門的曲線:失敗請求的來源渠道分布發(fā)生了變化。以前大頭來自App內支付按鈕,現(xiàn)在突然多了“第三方跳轉后回流”的比例。也就是說,出問題的并不是單純某版本前端,而是某種跳轉鏈路的回流邏輯。
“第三方回流?!绷种耐nD了一秒,“你們看過回流參數(shù)的簽名嗎?”
老陳搖頭:“還沒到這一步,我們只看了失敗碼和**層日志。”
林知夏起身去拿白板筆。她在白板上畫了一個簡化鏈路:用戶點擊支付——前端發(fā)起請求——服務端校驗——**轉發(fā)——支付結果回傳。她在“校驗”處打了個圈,在“回傳”處畫了問號。
“如果只是參數(shù)不一致,那失敗就發(fā)生在校驗階段,不影響回流?!彼f,“但你們說失敗率在擴大,還伴隨回
“校驗失???”林知夏喃喃,“這個一般不是支付**問題,更像是請求參數(shù)在鏈路中被改寫或不一致?!?br>“所以我們懷疑是前端打包版本沒更新干凈?!毙「咴谂赃叢逶?。他說話時像在努力保持節(jié)奏,不想讓情緒帶亂邏輯,“但他們后端說接口兼容,應該沒問題?!?br>林知夏沒有立刻反駁。她看向更深層的內容:失敗用戶的請求里,某些字段值與服務端期待不匹配。最關鍵的是,有一部分用戶的字段看上去“來自同一批前端”,但也有一部分像是被重放過,或者在緩存里被保留了舊版本的格式。
“重放?”她皺眉。
“不是我們定義的那種重放攻擊?!迸赃呌腥苏f,是運維的老陳。他聲音低,帶著煙嗓卻沒有煙味,“更像是**緩存策略沒刷新。”
林知夏在腦內把可能性排了一遍。她知道“緩存沒刷新”通常會導致舊字段仍被用在新接口上,從而引發(fā)一致性校驗失敗。但這又解釋不了為什么“影響范圍在擴大”。如果只是少數(shù)老緩存命中,故障不該不斷擴張,除非某個新的觸發(fā)因素讓更多請求走進了緩存路徑。
她把面板往下拉,注意到一個偏門的曲線:失敗請求的來源渠道分布發(fā)生了變化。以前大頭來自App內支付按鈕,現(xiàn)在突然多了“第三方跳轉后回流”的比例。也就是說,出問題的并不是單純某版本前端,而是某種跳轉鏈路的回流邏輯。
“第三方回流?!绷种耐nD了一秒,“你們看過回流參數(shù)的簽名嗎?”
老陳搖頭:“還沒到這一步,我們只看了失敗碼和**層日志。”
林知夏起身去拿白板筆。她在白板上畫了一個簡化鏈路:用戶點擊支付——前端發(fā)起請求——服務端校驗——**轉發(fā)——支付結果回傳。她在“校驗”處打了個圈,在“回傳”處畫了問號。
“如果只是參數(shù)不一致,那失敗就發(fā)生在校驗階段,不影響回流?!彼f,“但你們說失敗率在擴大,還伴隨回