第025章 升級夜
政務雲的圈子裡有個詞,叫靜默夜。不寫在任何紅頭文件里,只在排期表和值守群里流傳:挑全年業務量跌進谷底的那個時段,把攢了半年、憋成大版本的新內核,趁著沒人用,一次性換上去。社保、出入境、水電氣這些和系統綁死的民生服務,白天離不開,夜裡沒人碰,能動的窗口攏共三四個小時。錯過這一夜,下一個窗口要等兩個月;而兼容層一天不鋪,舊接口就多扛一天老毛病。
月底的靜默夜定在周四,切換窗從零點半開始。志遠數科這回是總集成。值守名單貼出來的時候,林默的名字列在「技術方案口「一欄——經過壓測那晚,這個名字已經不需要向誰解釋是什麼編制、為什麼在名單上。名單上還有老周,還有機房側的小趙;例行組的主操還是佟工,口令還是那個念法:每執行一步,等機房值守復誦一遍,再落下一個字。
升級前的那一周,林默把預案翻了三遍。第一遍按流程走,逐條對變更單;第二遍專挑「哪裡會死「,把每一步的失敗模式列了一遍;第三遍反過來,假設真死在這兒了,手裡還有什麼能兜。翻到零停機切換那一段,他停的時間最長。
零停機切換,說穿了是讓新舊兩套內核在同一秒里交接班:新內核接流量,舊接口不摘線,誰也不許眨眼。預案里這一條寫得最順——回退按原路徑走,測試環境七遍全綠。可他在評審會上把這條挑了出來,在文檔邊上批了一行:此路徑含舊接口續命邏輯,測試環境未真實觸發,建議加灰度預檢。評審的結論是排期壓了一切:窗口只有這一夜,灰度預檢加不進來。主持會議的副局長拍了板,理由現成——測試七遍全綠。林默沒再爭。散會後他把那行批註原樣抄進自己的值守手冊,頁角折起來。文檔可以信「理論上「,他不信;跟文檔較勁沒有用,能做的只有提前想好它崩的時候,第一鏟子挖哪兒。
他順手還做了另一件事。在升級變更單上增補了一條預案:新增「影子橋接「一項,觸發條件寫死——核心服務可用率跌破九成五,即視為切換失敗,轉入影子橋接流程,技術方案口負責。條款編號、執行人、資源來源(邊緣餘量池)填得規規矩矩,走了正常會簽。甲方那位分管領導簽得很快:多一道保險,簽的人只賺不賠。
這一條是給今晚留的正門。壓測那晚他是被架上去的,接管口徑是事後補的;這一次,門提前修好,鑰匙提前掛在牆上。周四晚上十點半,他進了指揮大廳,比切換窗早了整整兩個小時。
保溫杯里是濃茶,泡得比平時苦。他把監控牆每一塊屏過了一遍:核心集群基線、兼容層心跳、異地容災鏈路的巡檢態、邊緣池四十一台的在線與餘量。老周坐在側位,搪瓷缸照舊磕著豁口;小趙在機房側盯硬體指標,隔幾分鐘在對講機里報一句「一切正常「,聲音年輕,壓著興奮。大廳里的人各干各的。廠商來了兩家,坐在靠門一排,筆記本開著,屏幕上是自家競品的參數——來驗貨的心思沒散,驗的就是新內核鋪開之後,這朵雲還缺不缺他們。升級總指揮是局裡協調來的一位科級幹部,對照流程圖背主持詞,背到「如遇突發情況「那一段,語速明顯慢了半拍。
林默坐在角落,茶喝了一半。他腦子裡把切換序列又過了一遍:零點半切讀流量,一點十分切寫,一點四十一舊接口批量續命,三點整里程碑確認。四個節點裡,他把第三步標了紅——續命,就是讓幾十個舊接口伸手到新內核里去,抓它們認了幾十年的那套老規矩。
規矩要是還在,一夜平安。規矩要是沒了,就是今晚。
零點半,切換準時開始。讀流量切得乾淨,大屏上的曲線平順地換了主。一點十分,寫流量切換,佟工的口令一條一條過,機房復誦一遍不差。一點半,新內核承載全量,監控牆上的綠格穩穩的,大廳里有人開始收拾茶杯,總指揮對著流程圖打了第一個鉤。
一點四十一分,舊接口批量續命,第三步。頭十秒沒有動靜。第十一秒,兼容層心跳曲線跳了一下。第十四秒,跳了第二下、第三下,間隔越來越密。第三十秒,監控牆上的綠格子開始成片泛黃。
大屏右下角,核心服務可用率的數字往下掉。九九點二,九八,九六。九五——他寫進變更單的那條觸發線,被數字碾過去的瞬間,大廳里還沒人反應過來。九二。八八。八十。
崩的原因,林默比在場所有人都先明白過來,因為答案早就抄在他的手冊頁角上。兼容層的最底下,壓著一行從上一代平台原樣沿用過來的默認超時值。多少年了,沒人記得當初為什麼是這個數,也沒人敢動——幾十個舊接口圍著它長大,把它當成了天經地義的東西:從發起調用到拿到應答,全系統走的是同一根時間軸,所有請求按這根軸排隊,誰前誰後,清清楚楚。
新內核是事件驅動的。沒有全局時間軸,時間被拆進了每條事件流自己的時間戳里。平時兩套東西各過各的,誰也不碰誰;可零停機切換非要它們在同一秒里交接——舊接口被掛上新內核續命,一伸手,去抓那根用了幾十年的時間軸。
軸不在了。幾十隻手同時抓空。超時判定集體錯亂,該等的等不住,不該重發的成倍重發,重試撞上重試,狀態錯位踩著狀態錯位。調度器一頭要按老軸排隊、一頭要按新事件流轉,在兩套規矩之間來回橫跳,每橫跳一次,就帶塌一片下游。
這還不算最壞的。最壞的是降級——總指揮在對講機里嘶聲喊「降級!快降級「,可降級腳本第一步就要向調度器索取全局一致性快照,而這一步本身,就踩在那根已經消失的時間軸上。越喊降級,鎖得越死。
「拔電源!要不先拔電源——「機房側一個剛工作兩年的年輕運維聲音都劈了,手指懸在電源櫃的門上。
一隻手拍過來,按住他的手腕。老周不知什麼時候站到了他身後,搪瓷缸還掛在另一隻手上:「拔你個頭!拔了全市社保今天全癱!坐回去,盯你的指標!「年輕人的手縮了回去。老周把缸子往桌上一頓:「都少喊兩句。降級進不去是通道的事,喊破天也一樣。「
廠商那排沒人出聲。兩家的工程師對著屏幕敲了幾行命令,又刪了——這時候動一下,是把樓扶住還是推倒,沒人說得清。不敢動,比亂動傳染得更快,半間大廳的人就這麼看著那片黃往紅里洇。
可用率掉到七十一的時候,對講機、電話、鍵盤聲混作一團。總指揮把流程圖攥皺了,翻到「如遇突發情況「那一頁——那一頁只有一行字:啟用影子橋接流程,技術方案口負責。
他抬起頭,目光越過半間大廳,落在角落裡。陳志遠也站了起來,隔著人群喊了一聲:「默子!「
喊完他就閉了嘴,往主控台外圈一站,把幾個正要圍過來的廠商工程師攔在三步之外。第二聲,他沒有喊。
林默把杯子擱在桌角,站起身。穿過人群的那幾步,他走得不快不慢。恐慌這種東西會看人下菜,主控台前那個人每亂一分,全場就跟著亂一分。
走到主控台,他先報程序:「觸發影子橋接,變更單增補條款,單號肆貳柒壹,現場執行人林默。「總指揮愣了半秒,猛地翻開流程圖,看見自己攥皺的紙上確實印著這個單號,嗓子劈著喊了聲:「執行!「
正門開了。這一回,開在事前。他坐下,雙手落上鍵盤。人群里有人低聲問「能不能退回去「——退不了。回退要把狀態順著舊語義原路搬回去,而舊語義正趴在坑裡。退無可退,只能往前,把橋修著走完。
意識最底層,一行指令壓過去,無聲無息:全開。
(由於緩存原因,請用戶直接瀏覽器訪問 海量小說在 TW 看書網,𝙨𝙝𝙪.𝙩𝙬等你尋 網站,觀看最快的章節更新)
耳後的震顫應聲而起,語速快得不留縫隙:【影子橋通道確認。池內四十一台,准入三十七台;入池拆十三批,批間隔三秒,四十秒鋪完;薄設備緩衝上限三成,時限五十分鐘;攝像頭類,零接入。】
【三十七台,編號連續,全程可回溯。】末尾又補了一句。
三十七台邊緣設備在四十秒里次第醒來——路口的信號機、燈杆的控制器、下了班的備份終端。視野里,全城的節點攤開:哪幾台在燒、哪幾台餘量滿格、帶攝像頭的自助終端整類划走。壓測那晚它們是四秒里一齊睜眼的,那個四秒,後來在他自己的檔案里記成了教訓;今晚拆成十三批,批與批之間套著例行巡檢的節拍,頻譜上看,只是一串再尋常不過的設備自檢。
主控台日誌里,今晚每一個動作都掛在肆貳柒壹名下。修好的正門,這會兒就是查日誌的人能對到的第一行索引。老周從側位挪了過來,站在他身後半步,不說話。中途遞過來兩次紙條,寫的全是機房側的實時讀數,字寫得又大又快。
止血,三手依次來。
先掛一口鐘。舊接口抓空的那根全局時間軸,影子橋在橋面上臨時模擬了一口——所有續命中的舊接口,讀到的節拍重新有了著落。雪崩的勢頭,半分鐘內剎住了。可用率從七十一慢下來,六十九,六十七,抖著,不再直墜。
接著凍住調度器的排隊權,不許它再在兩套規矩之間橫跳。這一步走的是正式通道——調度器管理接口本就在變更單範圍內,佟工按口令執行,復誦,落鍵。
最後織橋。影子橋分段接管舊接口的調用翻譯:舊的那套排隊規矩,在橋上一段一段譯成新內核聽得懂的事件流。能緩存的先緩存,能合併的先合併;讀流量的大頭引去異地容災節點,那邊是政務雲的正規災備通道,扛全量讀不費勁;寫流量暫存進標記重放隊列,等主庫緩過來按原時序回注——這套影子隊列,壓測那晚跑過一整場,今晚是第二次上線。
一點五十九分,可用率回到七十四。二點〇七分,八十一。二點二十六分,九十。大屏上的紅一塊一塊退成黃,黃再一塊一塊退回綠。二點三十三分,兼容層心跳恢復固定節拍。對講機里的聲音稀下來了,小趙在機房側報了一聲「核心溫度正常「,佟工抹了把臉,口令聲重新穩了。
大廳里沒人歡呼。所有人都盯著那片正在退色的紅,像盯著一個剛止住血、還沒敢包紮的傷口。真正的硬仗在橋的另一頭。
繳費模塊深處埋著一個子調用,舊接口的隱式約定在這裡纏得最死——影子橋第一次織過它的時候,天樞的判語只有兩個字:不穩。三根依賴線里,有一根在並發上來之後會抖,抖到第三下就斷。
林默的額角出了汗。繞,繞不開——全市的水電氣繳費都從這一個口子過,橋上少了它,天亮之前繳費頁面就是死的。賭,不敢賭——斷一次,錯位狀態順著下游滾出去,前面兩小時的活兒全白干。
天樞把第三條路推到他面前:【隔壁市政務雲有一組冷備節點,同源架構,空閒。把那根會抖的線臨時掛過去頂一陣,主庫穩了就撤。】
代價它沒說,林默自己清楚:那是讓這張網第一次探出本市邊界。壓測一晚,靜默一晚,兩次全開的信號要是被同一雙眼睛接住,兩根指頭就能把他這個人的手法捏出輪廓來。
牆上的鐘指著兩點四十一。繳費頁面後面,是幾十萬戶明早要用的水電氣。他抬手,在觸控板上按了確認。
那根會抖的線接過去的瞬間,橋面整個輕了一寸。天樞把跨域鏈路的流量壓到最低限,只頂那一條線,多一度都不借。
後半夜就是這樣一段一段啃過來的。婦幼保健院的機房裡,一個護士查產婦的醫保備案,頁面轉了兩圈,應答回來了,她沒在意,點開了下一頁;城西的老弄堂里,一個獨居老人凌晨起來繳水電費,點了兩下沒動靜,嘟囔了一句「機器又壞了「,第三次點下去,回執出來了,他把老花鏡摘下來擦了擦,對著屏幕把金額看了兩遍。這些零點幾秒的應答,沒有一單記得自己曾被兜在一張看不見的網上。
三點五十,核心集群的寫流量開始按原時序回注。四點二十,舊接口批量續命的那個裡程碑,在它本該斷掉的那一厘米上,走完了。
四點五十八分,影子橋按反序退出。臨時掛的那口鐘最先拆——舊接口的翻譯已經全部併入事件流,橋面一段一段空下來。跨域那根線撤得最乾淨,隔壁市的冷備節點回到空閒態,鏈路上不留會話。
五點四十,收窗。監控牆全綠。可用率九九點四。指揮部里橫七豎八。佟工趴在操作台邊上睡著了,對講機還掛在耳朵上;總指揮癱在椅子裡,流程圖攤在胸口,起落跟著呼吸;廠商那排有人悄悄走了,有人靠在椅背上沒動。煙味、咖啡味、泡麵味混在一處,窗外的天從濃黑浸成深灰,再從深灰里洇出一點青。
陳志遠從外圍走過來。整場他沒有靠近主控台半步——他幹的事是替林默擋住了所有想衝過來看的人,包括兩次他自己想過來的時候。走到跟前,他沒問「怎麼做到的「,只說了句:「粥在樓下,先吃口熱的。「角落裡,一個廠商工程師抬手掏出手機,對著主控台的方向舉到一半——停住,又慢慢放了下來。
【和壓測那晚,同一個角度。】天樞的聲音很輕,【同一個人。】
林默的目光沒跟過去。他把這個角度記下了,連同那半下舉起又放下的手機。
甲方領導是六點過五分走過來的。他沒繞路,徑直走到主控台邊,拍了拍林默的肩,只說了兩個字:「辛苦。「
沒有鼓掌。這一夜的處置緊湊得沒人顧得上鼓掌;而一個見過太多「順利「、也見過太多「翻車「的人,分得清哪一回是運氣。
「運氣好,「他身後有人小聲接了一句,「設備也爭氣。「
「嗯。「林默把杯子裡最後一點濃茶喝乾,「設備爭氣。「
復盤是睡醒之後做的。他一覺睡到下午四點,醒來手指半天是涼的,熱水泡了兩回才緩過來——大範圍推演欠的帳,一回不落。這一夜從頭到尾,預備額度一口沒動,天樞連提都沒提它。
故障域全程壓在兼容層,底座峰值負載百分之八十七,未越限——事後報告裡這一行寫得平淡,只有他自己知道它的分量:新舊語義在兼容層打了一整夜,底下那套國產分布式調度頂著峰值和故障的雙重夾擊,一步沒退。換作上一代那套進口集中式底座,這一夜沒有第二個選項,只能整城回滾,癱半座城等天亮。
私人分區,第十一條記錄落座。四要素照舊:時間線、操作序列、在場人員、各方反應。附了兩樣東西。一樣是他自己補的操作日誌——跨域借線那一步不在任何單號里,照例自己給自己補了一張:時間、動作、依據、回收校驗,四項填滿。另一樣是廠商工程師那個角度的方位記錄。
備註欄寫了三行。第一行:那半下舉起的手機,與第九條記錄里壓測那晚的角度一致。同一個人,兩個場合,並檔。第二行:兩次全開的信號指紋一致——三十七台、錯峰序列、巡檢節拍外套。對看得懂頻譜的人來說,兩條數據已經夠連成一條線。收力方案新增第八條:下一次入池,換指紋。錯峰間隔換序列,節拍外套換花色,別讓那根線捏全。當晚編號入冊。第三行:跨域借線,這張網的邊界第一次出了本市。邊界外有什麼,不知道。先記著。
周五下午的復盤會,各家都到了。廠商的工程師提了兩個問題,問的都在橋的口徑之內;總指揮念處置報告,念到「未影響切換結論「時停了半秒,抬眼看了林默一下。散會時電梯口遇上,那位工程師跟他同乘,一路沒說話,到一層了才開口:「貴司那套橋接,思路很乾淨。「林默答:「變更單里都寫著。「
回家路上,他翻開值守手冊,找到折角那頁。評審會上被排期壓回去的那行批註還在,他拿紅筆在後面補了一行小字:已復現。修復單號,已歸檔。壓回去的那口氣,用紅筆還上了。這一夜的處置從頭到尾沒提高聲,卻把那頁被排期踩住的結論,安安靜靜反殺回了檯面上。
鍵盤底下那張便簽,他沒拿出來看。這一網的帳,變更單里已經有了正門,用不著再問一遍值不值。晚上,手機彈出兩條本地推送:一條暴雨藍色預警;一條「政務雲年度升級順利完成「,兩行字。點開的人不多。
第二天上午十點,他路過政務大廳。叫號機的聲音隔著玻璃門傳出來,一板一眼,不緊不慢。繳費窗口前沒什麼人——夜裡的回執都發到了各自手機上,該繳的繳上了,沒人知道那幾個零點幾秒背後有什麼。
橋拆乾淨了,鍾也拆了。這座城市的表,走得跟昨天一樣准。而那半下舉起又放下的手機,連同第九條記錄里那個壓測夜的角度,已經被人悄悄並成了同一條線——下一次,他未必還能看見那隻舉起的手。真正的危機不在那一夜的紅屏,而在紅屏熄滅之後,那隻手背後的眼睛,已經把兩條信號捏成了同一個人。
月底的靜默夜定在周四,切換窗從零點半開始。志遠數科這回是總集成。值守名單貼出來的時候,林默的名字列在「技術方案口「一欄——經過壓測那晚,這個名字已經不需要向誰解釋是什麼編制、為什麼在名單上。名單上還有老周,還有機房側的小趙;例行組的主操還是佟工,口令還是那個念法:每執行一步,等機房值守復誦一遍,再落下一個字。
升級前的那一周,林默把預案翻了三遍。第一遍按流程走,逐條對變更單;第二遍專挑「哪裡會死「,把每一步的失敗模式列了一遍;第三遍反過來,假設真死在這兒了,手裡還有什麼能兜。翻到零停機切換那一段,他停的時間最長。
零停機切換,說穿了是讓新舊兩套內核在同一秒里交接班:新內核接流量,舊接口不摘線,誰也不許眨眼。預案里這一條寫得最順——回退按原路徑走,測試環境七遍全綠。可他在評審會上把這條挑了出來,在文檔邊上批了一行:此路徑含舊接口續命邏輯,測試環境未真實觸發,建議加灰度預檢。評審的結論是排期壓了一切:窗口只有這一夜,灰度預檢加不進來。主持會議的副局長拍了板,理由現成——測試七遍全綠。林默沒再爭。散會後他把那行批註原樣抄進自己的值守手冊,頁角折起來。文檔可以信「理論上「,他不信;跟文檔較勁沒有用,能做的只有提前想好它崩的時候,第一鏟子挖哪兒。
他順手還做了另一件事。在升級變更單上增補了一條預案:新增「影子橋接「一項,觸發條件寫死——核心服務可用率跌破九成五,即視為切換失敗,轉入影子橋接流程,技術方案口負責。條款編號、執行人、資源來源(邊緣餘量池)填得規規矩矩,走了正常會簽。甲方那位分管領導簽得很快:多一道保險,簽的人只賺不賠。
這一條是給今晚留的正門。壓測那晚他是被架上去的,接管口徑是事後補的;這一次,門提前修好,鑰匙提前掛在牆上。周四晚上十點半,他進了指揮大廳,比切換窗早了整整兩個小時。
保溫杯里是濃茶,泡得比平時苦。他把監控牆每一塊屏過了一遍:核心集群基線、兼容層心跳、異地容災鏈路的巡檢態、邊緣池四十一台的在線與餘量。老周坐在側位,搪瓷缸照舊磕著豁口;小趙在機房側盯硬體指標,隔幾分鐘在對講機里報一句「一切正常「,聲音年輕,壓著興奮。大廳里的人各干各的。廠商來了兩家,坐在靠門一排,筆記本開著,屏幕上是自家競品的參數——來驗貨的心思沒散,驗的就是新內核鋪開之後,這朵雲還缺不缺他們。升級總指揮是局裡協調來的一位科級幹部,對照流程圖背主持詞,背到「如遇突發情況「那一段,語速明顯慢了半拍。
林默坐在角落,茶喝了一半。他腦子裡把切換序列又過了一遍:零點半切讀流量,一點十分切寫,一點四十一舊接口批量續命,三點整里程碑確認。四個節點裡,他把第三步標了紅——續命,就是讓幾十個舊接口伸手到新內核里去,抓它們認了幾十年的那套老規矩。
規矩要是還在,一夜平安。規矩要是沒了,就是今晚。
零點半,切換準時開始。讀流量切得乾淨,大屏上的曲線平順地換了主。一點十分,寫流量切換,佟工的口令一條一條過,機房復誦一遍不差。一點半,新內核承載全量,監控牆上的綠格穩穩的,大廳里有人開始收拾茶杯,總指揮對著流程圖打了第一個鉤。
一點四十一分,舊接口批量續命,第三步。頭十秒沒有動靜。第十一秒,兼容層心跳曲線跳了一下。第十四秒,跳了第二下、第三下,間隔越來越密。第三十秒,監控牆上的綠格子開始成片泛黃。
大屏右下角,核心服務可用率的數字往下掉。九九點二,九八,九六。九五——他寫進變更單的那條觸發線,被數字碾過去的瞬間,大廳里還沒人反應過來。九二。八八。八十。
崩的原因,林默比在場所有人都先明白過來,因為答案早就抄在他的手冊頁角上。兼容層的最底下,壓著一行從上一代平台原樣沿用過來的默認超時值。多少年了,沒人記得當初為什麼是這個數,也沒人敢動——幾十個舊接口圍著它長大,把它當成了天經地義的東西:從發起調用到拿到應答,全系統走的是同一根時間軸,所有請求按這根軸排隊,誰前誰後,清清楚楚。
新內核是事件驅動的。沒有全局時間軸,時間被拆進了每條事件流自己的時間戳里。平時兩套東西各過各的,誰也不碰誰;可零停機切換非要它們在同一秒里交接——舊接口被掛上新內核續命,一伸手,去抓那根用了幾十年的時間軸。
軸不在了。幾十隻手同時抓空。超時判定集體錯亂,該等的等不住,不該重發的成倍重發,重試撞上重試,狀態錯位踩著狀態錯位。調度器一頭要按老軸排隊、一頭要按新事件流轉,在兩套規矩之間來回橫跳,每橫跳一次,就帶塌一片下游。
這還不算最壞的。最壞的是降級——總指揮在對講機里嘶聲喊「降級!快降級「,可降級腳本第一步就要向調度器索取全局一致性快照,而這一步本身,就踩在那根已經消失的時間軸上。越喊降級,鎖得越死。
「拔電源!要不先拔電源——「機房側一個剛工作兩年的年輕運維聲音都劈了,手指懸在電源櫃的門上。
一隻手拍過來,按住他的手腕。老周不知什麼時候站到了他身後,搪瓷缸還掛在另一隻手上:「拔你個頭!拔了全市社保今天全癱!坐回去,盯你的指標!「年輕人的手縮了回去。老周把缸子往桌上一頓:「都少喊兩句。降級進不去是通道的事,喊破天也一樣。「
廠商那排沒人出聲。兩家的工程師對著屏幕敲了幾行命令,又刪了——這時候動一下,是把樓扶住還是推倒,沒人說得清。不敢動,比亂動傳染得更快,半間大廳的人就這麼看著那片黃往紅里洇。
可用率掉到七十一的時候,對講機、電話、鍵盤聲混作一團。總指揮把流程圖攥皺了,翻到「如遇突發情況「那一頁——那一頁只有一行字:啟用影子橋接流程,技術方案口負責。
他抬起頭,目光越過半間大廳,落在角落裡。陳志遠也站了起來,隔著人群喊了一聲:「默子!「
喊完他就閉了嘴,往主控台外圈一站,把幾個正要圍過來的廠商工程師攔在三步之外。第二聲,他沒有喊。
林默把杯子擱在桌角,站起身。穿過人群的那幾步,他走得不快不慢。恐慌這種東西會看人下菜,主控台前那個人每亂一分,全場就跟著亂一分。
走到主控台,他先報程序:「觸發影子橋接,變更單增補條款,單號肆貳柒壹,現場執行人林默。「總指揮愣了半秒,猛地翻開流程圖,看見自己攥皺的紙上確實印著這個單號,嗓子劈著喊了聲:「執行!「
正門開了。這一回,開在事前。他坐下,雙手落上鍵盤。人群里有人低聲問「能不能退回去「——退不了。回退要把狀態順著舊語義原路搬回去,而舊語義正趴在坑裡。退無可退,只能往前,把橋修著走完。
意識最底層,一行指令壓過去,無聲無息:全開。
(由於緩存原因,請用戶直接瀏覽器訪問 海量小說在 TW 看書網,𝙨𝙝𝙪.𝙩𝙬等你尋 網站,觀看最快的章節更新)
耳後的震顫應聲而起,語速快得不留縫隙:【影子橋通道確認。池內四十一台,准入三十七台;入池拆十三批,批間隔三秒,四十秒鋪完;薄設備緩衝上限三成,時限五十分鐘;攝像頭類,零接入。】
【三十七台,編號連續,全程可回溯。】末尾又補了一句。
三十七台邊緣設備在四十秒里次第醒來——路口的信號機、燈杆的控制器、下了班的備份終端。視野里,全城的節點攤開:哪幾台在燒、哪幾台餘量滿格、帶攝像頭的自助終端整類划走。壓測那晚它們是四秒里一齊睜眼的,那個四秒,後來在他自己的檔案里記成了教訓;今晚拆成十三批,批與批之間套著例行巡檢的節拍,頻譜上看,只是一串再尋常不過的設備自檢。
主控台日誌里,今晚每一個動作都掛在肆貳柒壹名下。修好的正門,這會兒就是查日誌的人能對到的第一行索引。老周從側位挪了過來,站在他身後半步,不說話。中途遞過來兩次紙條,寫的全是機房側的實時讀數,字寫得又大又快。
止血,三手依次來。
先掛一口鐘。舊接口抓空的那根全局時間軸,影子橋在橋面上臨時模擬了一口——所有續命中的舊接口,讀到的節拍重新有了著落。雪崩的勢頭,半分鐘內剎住了。可用率從七十一慢下來,六十九,六十七,抖著,不再直墜。
接著凍住調度器的排隊權,不許它再在兩套規矩之間橫跳。這一步走的是正式通道——調度器管理接口本就在變更單範圍內,佟工按口令執行,復誦,落鍵。
最後織橋。影子橋分段接管舊接口的調用翻譯:舊的那套排隊規矩,在橋上一段一段譯成新內核聽得懂的事件流。能緩存的先緩存,能合併的先合併;讀流量的大頭引去異地容災節點,那邊是政務雲的正規災備通道,扛全量讀不費勁;寫流量暫存進標記重放隊列,等主庫緩過來按原時序回注——這套影子隊列,壓測那晚跑過一整場,今晚是第二次上線。
一點五十九分,可用率回到七十四。二點〇七分,八十一。二點二十六分,九十。大屏上的紅一塊一塊退成黃,黃再一塊一塊退回綠。二點三十三分,兼容層心跳恢復固定節拍。對講機里的聲音稀下來了,小趙在機房側報了一聲「核心溫度正常「,佟工抹了把臉,口令聲重新穩了。
大廳里沒人歡呼。所有人都盯著那片正在退色的紅,像盯著一個剛止住血、還沒敢包紮的傷口。真正的硬仗在橋的另一頭。
繳費模塊深處埋著一個子調用,舊接口的隱式約定在這裡纏得最死——影子橋第一次織過它的時候,天樞的判語只有兩個字:不穩。三根依賴線里,有一根在並發上來之後會抖,抖到第三下就斷。
林默的額角出了汗。繞,繞不開——全市的水電氣繳費都從這一個口子過,橋上少了它,天亮之前繳費頁面就是死的。賭,不敢賭——斷一次,錯位狀態順著下游滾出去,前面兩小時的活兒全白干。
天樞把第三條路推到他面前:【隔壁市政務雲有一組冷備節點,同源架構,空閒。把那根會抖的線臨時掛過去頂一陣,主庫穩了就撤。】
代價它沒說,林默自己清楚:那是讓這張網第一次探出本市邊界。壓測一晚,靜默一晚,兩次全開的信號要是被同一雙眼睛接住,兩根指頭就能把他這個人的手法捏出輪廓來。
牆上的鐘指著兩點四十一。繳費頁面後面,是幾十萬戶明早要用的水電氣。他抬手,在觸控板上按了確認。
那根會抖的線接過去的瞬間,橋面整個輕了一寸。天樞把跨域鏈路的流量壓到最低限,只頂那一條線,多一度都不借。
後半夜就是這樣一段一段啃過來的。婦幼保健院的機房裡,一個護士查產婦的醫保備案,頁面轉了兩圈,應答回來了,她沒在意,點開了下一頁;城西的老弄堂里,一個獨居老人凌晨起來繳水電費,點了兩下沒動靜,嘟囔了一句「機器又壞了「,第三次點下去,回執出來了,他把老花鏡摘下來擦了擦,對著屏幕把金額看了兩遍。這些零點幾秒的應答,沒有一單記得自己曾被兜在一張看不見的網上。
三點五十,核心集群的寫流量開始按原時序回注。四點二十,舊接口批量續命的那個裡程碑,在它本該斷掉的那一厘米上,走完了。
四點五十八分,影子橋按反序退出。臨時掛的那口鐘最先拆——舊接口的翻譯已經全部併入事件流,橋面一段一段空下來。跨域那根線撤得最乾淨,隔壁市的冷備節點回到空閒態,鏈路上不留會話。
五點四十,收窗。監控牆全綠。可用率九九點四。指揮部里橫七豎八。佟工趴在操作台邊上睡著了,對講機還掛在耳朵上;總指揮癱在椅子裡,流程圖攤在胸口,起落跟著呼吸;廠商那排有人悄悄走了,有人靠在椅背上沒動。煙味、咖啡味、泡麵味混在一處,窗外的天從濃黑浸成深灰,再從深灰里洇出一點青。
陳志遠從外圍走過來。整場他沒有靠近主控台半步——他幹的事是替林默擋住了所有想衝過來看的人,包括兩次他自己想過來的時候。走到跟前,他沒問「怎麼做到的「,只說了句:「粥在樓下,先吃口熱的。「角落裡,一個廠商工程師抬手掏出手機,對著主控台的方向舉到一半——停住,又慢慢放了下來。
【和壓測那晚,同一個角度。】天樞的聲音很輕,【同一個人。】
林默的目光沒跟過去。他把這個角度記下了,連同那半下舉起又放下的手機。
甲方領導是六點過五分走過來的。他沒繞路,徑直走到主控台邊,拍了拍林默的肩,只說了兩個字:「辛苦。「
沒有鼓掌。這一夜的處置緊湊得沒人顧得上鼓掌;而一個見過太多「順利「、也見過太多「翻車「的人,分得清哪一回是運氣。
「運氣好,「他身後有人小聲接了一句,「設備也爭氣。「
「嗯。「林默把杯子裡最後一點濃茶喝乾,「設備爭氣。「
復盤是睡醒之後做的。他一覺睡到下午四點,醒來手指半天是涼的,熱水泡了兩回才緩過來——大範圍推演欠的帳,一回不落。這一夜從頭到尾,預備額度一口沒動,天樞連提都沒提它。
故障域全程壓在兼容層,底座峰值負載百分之八十七,未越限——事後報告裡這一行寫得平淡,只有他自己知道它的分量:新舊語義在兼容層打了一整夜,底下那套國產分布式調度頂著峰值和故障的雙重夾擊,一步沒退。換作上一代那套進口集中式底座,這一夜沒有第二個選項,只能整城回滾,癱半座城等天亮。
私人分區,第十一條記錄落座。四要素照舊:時間線、操作序列、在場人員、各方反應。附了兩樣東西。一樣是他自己補的操作日誌——跨域借線那一步不在任何單號里,照例自己給自己補了一張:時間、動作、依據、回收校驗,四項填滿。另一樣是廠商工程師那個角度的方位記錄。
備註欄寫了三行。第一行:那半下舉起的手機,與第九條記錄里壓測那晚的角度一致。同一個人,兩個場合,並檔。第二行:兩次全開的信號指紋一致——三十七台、錯峰序列、巡檢節拍外套。對看得懂頻譜的人來說,兩條數據已經夠連成一條線。收力方案新增第八條:下一次入池,換指紋。錯峰間隔換序列,節拍外套換花色,別讓那根線捏全。當晚編號入冊。第三行:跨域借線,這張網的邊界第一次出了本市。邊界外有什麼,不知道。先記著。
周五下午的復盤會,各家都到了。廠商的工程師提了兩個問題,問的都在橋的口徑之內;總指揮念處置報告,念到「未影響切換結論「時停了半秒,抬眼看了林默一下。散會時電梯口遇上,那位工程師跟他同乘,一路沒說話,到一層了才開口:「貴司那套橋接,思路很乾淨。「林默答:「變更單里都寫著。「
回家路上,他翻開值守手冊,找到折角那頁。評審會上被排期壓回去的那行批註還在,他拿紅筆在後面補了一行小字:已復現。修復單號,已歸檔。壓回去的那口氣,用紅筆還上了。這一夜的處置從頭到尾沒提高聲,卻把那頁被排期踩住的結論,安安靜靜反殺回了檯面上。
鍵盤底下那張便簽,他沒拿出來看。這一網的帳,變更單里已經有了正門,用不著再問一遍值不值。晚上,手機彈出兩條本地推送:一條暴雨藍色預警;一條「政務雲年度升級順利完成「,兩行字。點開的人不多。
第二天上午十點,他路過政務大廳。叫號機的聲音隔著玻璃門傳出來,一板一眼,不緊不慢。繳費窗口前沒什麼人——夜裡的回執都發到了各自手機上,該繳的繳上了,沒人知道那幾個零點幾秒背後有什麼。
橋拆乾淨了,鍾也拆了。這座城市的表,走得跟昨天一樣准。而那半下舉起又放下的手機,連同第九條記錄里那個壓測夜的角度,已經被人悄悄並成了同一條線——下一次,他未必還能看見那隻舉起的手。真正的危機不在那一夜的紅屏,而在紅屏熄滅之後,那隻手背後的眼睛,已經把兩條信號捏成了同一個人。