“七次。”李軒的聲音啞得像砂紙,“剛才是崩潰在交易記錄同步環節。
并發寫入的時候鎖沖突導致回滾,回滾的過程里價格緩存表被清空了,后面的讀取直接報錯。”
“怎么修?”
“把價格緩存表跟交易日志表分離。
日志表只做順序寫入,不參與價格計算。
價格表用內存隊列單獨維護,每次交易完成之后先把結果寫進內存隊列,再由隊列異步落盤。
這樣讀寫分離之后鎖沖突應該能降下去。”
他敲鍵盤的時候指尖幾乎是砸在鍵帽上的,每一擊都帶著一種又急又克制的力道。
他旁邊那個棒球帽程序員側過頭看著他敲完那段代碼,然后轉回去在自己的屏幕上打開了一個新的調試窗口。
他在調試窗口里輸入了幾行測試命令,盯著反饋的結果看了大概二十秒,然后從嘴里擠出一句話:“隊列長度設了多少?”
“一千。”
“一千夠嗎?峰值并發按每秒三十筆算,隊列寫入的積壓如果超過處理速度,遲早會溢出來。”
“所以我在落盤線程里加了背壓控制,隊列長度超過八百的時候就觸發降速寫入。
數據先存在磁盤緩沖區里,等隊列清到五百以下再恢復異步落盤。”李軒說著,手指在鍵盤上敲了幾行代碼,把那部分邏輯補了進去。
棒球帽程序員看完之后點了點頭,帽檐隨著他點頭的動作上下晃了一下,然后又停住了。
他把帽檐往上推了一點,露出額頭,額頭上有一道被帽檐壓出來的紅印。
“行了,跑一遍看看。”
李軒按下回車鍵。
屏幕上的進度條重新從零開始走,這一次比之前任何一次都走得順暢。
百分之十的時候梁永琪低頭看了一眼手機,沒有新消息。
百分之二十五的時候角落里的泡面程序員打了一個哈欠,哈欠打到一半硬生生憋了回去,變成了一聲悶在嘴里的氣音。
百分之四十的時候李軒的身體往前傾了一點,兩只手懸在鍵盤上方,像一只等著獵物靠近的貓。
百分之六十三的時候棒球帽程序員把帽檐推到了頭頂,露出整張臉,他的臉上全是出油之后覆蓋的一層薄光,眼底紅得像被辣椒水洗過。
百分之八十一的時候梁永琪感覺到自己的手心在出汗,保溫杯的外壁被她握得發滑。
到百分之九十一的時候進度條的移動速度慢了下來,像一根指針在接近某個標記時微微遲疑了一下,但最終它還是跨了過去。
百分之百。
進度條填滿之后屏幕中央跳出了一行綠色的文字:“測試通過。
交易記錄同步正常,價格表更新正常,并發壓力測試正常。”
機房里安靜了大約三秒鐘。
角落里那臺備用機的風扇還在轉,李軒旁邊那臺主控機的硬盤燈在規律地閃爍著。
沒有人說話,沒有人站起來。
那種安靜不是沒話說的安靜,是所有人都被什么東西卡住了喉嚨,一時之間發不出聲音。
李軒把鍵盤往前推了推,鍵盤底部蹭著桌面發出一聲短促的摩擦聲。
他靠進椅背里,兩只手垂在椅子扶手的外側,頭往后仰著,后腦勺的頭發壓住椅背的頂端。
他看著天花板,嘴唇動了一下,發出了一個只有他自己能聽見的音節,但梁永琪聽到了。
“成了。”
他說完之后閉上眼,喉嚨里有一聲極輕的氣音翻上來又沉下去。