2019-01-02線上問題排查

問題描述

第三方的用戶A用戶定了5筆訂單,B用戶定了1筆訂單。但是訂單中心收到的卻是A定了4筆訂單,B用戶定了2筆訂單。

初步排查

整個調用流程為
上游渠道->sdp->訂單中心(本系統)->下游渠道
初步懷疑是sdp進行轉發的時候導致了并發問題。所以就將sdp的日志進行查看排查,結果發現sdp的轉發沒有問題,所以開始進行訂單中心的代碼審查。

訂單中心排查

因為是訂單中心代碼日志打印的時候,已經出現了入參替換,所以懷疑是在日志攔截器之前。剛好,在日志攔截之前有一個對request進行替換的動作發生了。所以查找這個類ChangeInVarsFilter。看到了他具體的替換邏輯如下圖:


替換request代碼實現

那么再次進入這個方法看到如下邏輯:


具體的獲取Wrequest邏輯

看到這里,就發現了一個變量resourceStr,只有這個變量可能出問題了,因為其他的都是線程安全的。都是方法內變量。所以繼續查看。
resourceStr的變量類型及初始化時機

看到這里,基本上也明白是咋么回事了。也就是resourceStr變量是一個靜態變量,是共享資源。當線程a完成了對resourceStr的初始化的時候,還沒有來得及做下面的動作,b線程進入,并且又對resourceStr進行了初始化。再接下來的動作中a線程中的變量resourceStr已經與b線程的一致。
至此,問題基本明了,接下來就是修改了。

問題解決

問題解決思路,將共享變量resourceStr變成對象的成員變量,如下圖:


resourceStr實例變量

然后就方法也改為實例方法即可。改造完成。試了下效果沒有問題。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Swift1> Swift和OC的區別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,135評論 1 32
  • Java繼承關系初始化順序 父類的靜態變量-->父類的靜態代碼塊-->子類的靜態變量-->子類的靜態代碼快-->父...
    第六象限閱讀 2,172評論 0 9
  • 專業考題類型管理運行工作負責人一般作業考題內容選項A選項B選項C選項D選項E選項F正確答案 變電單選GYSZ本規程...
    小白兔去釣魚閱讀 9,051評論 0 13
  • 女兒的舞蹈學校組織去凱光水上樂園表演。女兒說她很激動,晚上睡不著。我說其實只是換了個地點練習,在學校怎么跳...
    一本經典的書閱讀 218評論 0 0
  • 公司:寧波大發化纖有限公司 姓名:馮玉停 期數:六項精進224期感謝二組學員,234期感謝三組志工,260期感謝一...
    塵埃wyzh閱讀 88評論 0 0