一次并發(fā)問題的排查與解決

今天下午有同事反饋訂單列表頁狀態(tài)與詳情頁狀態(tài)不一致宋欺。

背景:
用戶下單及付款等操作后,部分訂單信息會推送到公司二方團隊用于列表頁展示胰伍。
(列表頁由平臺統(tǒng)一維護齿诞,詳情頁業(yè)務(wù)方維護)
有業(yè)務(wù)事件發(fā)生時,會推一次訂單骂租。因而同一訂單會多次推送祷杈。
不同業(yè)務(wù)事件間隔不定,存在并發(fā)推送一條數(shù)據(jù)的場景菩咨。

核對日志吠式,發(fā)現(xiàn)了問題。

訂單推送時抽米,平臺會以version的大小作為是否拋棄該次推送結(jié)果特占。

背景:
version計算邏輯:用當(dāng)前時間減去下單時間
將歷史推送的version存于DB,每次從DB中獲取當(dāng)前的version(只查有效的云茸,不含軟刪)是目。
version+1后,先將當(dāng)前的version軟刪标捺,再寫進一條數(shù)據(jù)懊纳。
(超過Integer.MAX_VALUE有單獨邏輯)
若version不存在,則會根據(jù)當(dāng)前時間重新生成一條version亡容,寫入DB嗤疯。

坑點:平臺接收推送數(shù)據(jù)成功,數(shù)據(jù)格式正確闺兢,即會告知業(yè)務(wù)方推送成功茂缚。
對推送version小于歷史version的數(shù)據(jù),平臺內(nèi)部會拋棄該次推送的數(shù)據(jù)屋谭,但是仍然告知業(yè)務(wù)方推送成功脚囊。

根據(jù)訂單號去查該訂單的推送version記錄:

verison記錄

可以看出有一條version超大。從日志上看桐磁,35和10973兩條記錄的推送間隔在ms級別悔耘。
由于平臺的策略,導(dǎo)致version10973之后的推送數(shù)據(jù)均會失效我擂。

根據(jù)DB中version數(shù)據(jù)反推衬以,時序如下:

請求時序

這里還存在代碼bug:之前是向從庫查詢version記錄缓艳,在A將34置為無效并同步到從庫后,B讀從庫發(fā)現(xiàn)無記錄泄鹏,然后B會向主庫寫了一條新的version記錄10973郎任。讀從庫增大了A、B之間的時間差备籽。

發(fā)現(xiàn)了問題之后舶治,fix策略:

查詢version均走主庫
若不存在version,生成后寫入车猬;
若存在霉猛,將當(dāng)前version+1,帶樂觀鎖version更新(放棄軟刪+新增步驟)珠闰;
若更新失敗惜浅,則查詢實時的version,+1后再次帶樂觀鎖version更新伏嗜;
對于推送的數(shù)據(jù)部分坛悉,實時查主庫后再推送;
(實際fix邏輯比這復(fù)雜承绸,由于一些原因不過多描述)

事后反思裸影,存在以下問題:

關(guān)鍵操作,不能讀從庫军熏;
對于同一條數(shù)據(jù)的操作轩猩,不能先軟刪,再新增一條數(shù)據(jù)(非原子操作荡澎,會造成很多問題均践,如軟刪遺漏、新增失敗摩幔,均會導(dǎo)致問題)彤委;
平臺應(yīng)明確告知會拋棄當(dāng)前數(shù)據(jù)(告知原因更佳),而不是告知成功或衡;
推送前應(yīng)實時查最新數(shù)據(jù)焦影,而是已有數(shù)據(jù);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末薇宠,一起剝皮案震驚了整個濱河市偷办,隨后出現(xiàn)的幾起案子艰额,更是在濱河造成了極大的恐慌澄港,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柄沮,死亡現(xiàn)場離奇詭異回梧,居然都是意外死亡废岂,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門狱意,熙熙樓的掌柜王于貴愁眉苦臉地迎上來湖苞,“玉大人,你說我怎么就攤上這事详囤〔乒牵” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵藏姐,是天一觀的道長隆箩。 經(jīng)常有香客問我,道長羔杨,這世上最難降的妖魔是什么捌臊? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮兜材,結(jié)果婚禮上理澎,老公的妹妹穿的比我還像新娘。我一直安慰自己曙寡,他們只是感情好糠爬,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著卵皂,像睡著了一般秩铆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上灯变,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天殴玛,我揣著相機與錄音,去河邊找鬼添祸。 笑死滚粟,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的刃泌。 我是一名探鬼主播凡壤,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼耙替!你這毒婦竟也來了亚侠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤俗扇,失蹤者是張志新(化名)和其女友劉穎硝烂,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铜幽,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡滞谢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年串稀,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狮杨。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡母截,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出橄教,到底是詐尸還是另有隱情清寇,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布护蝶,位于F島的核電站颗管,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏滓走。R本人自食惡果不足惜垦江,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望搅方。 院中可真熱鬧比吭,春花似錦、人聲如沸姨涡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涛漂。三九已至赏表,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間匈仗,已是汗流浹背瓢剿。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留悠轩,地道東北人间狂。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像火架,于是被迫代替她去往敵國和親鉴象。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容