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