【第40章 徐爺】
------------------------------------------
週三下午兩點,陳星把大G停進建明科技的地下車庫。
他剛從老家回來,四個小時的高速,臉上帶著一點疲憊,但眼神很亮。副駕駛上放著林秀蘭塞給他的一袋東西——桂花糕、醬菜、幾盒他小時候愛吃的芝麻糖。
他拎著東西上樓。
十四樓的辦公區跟往常一樣忙碌。孫浩蹲在工位上對著螢幕唸唸有詞,劉敏在跟張磊討論寬表欄位的命名規範,幾個新來的實習生在角落裡翻文件。秦若寒坐在工位上,三塊螢幕全亮著,正在寫開放平台的定價方案,鍵盤聲又快又密。
陳星走到工位前把東西放下。孫浩第一個抬起頭,眼睛一亮:“陳老師回來了!叔叔手術怎麼樣?”
“順利。”
“那就好那就好!”孫浩從工位上蹦起來,跑到茶水間端回來一杯熱美式放在陳星桌上,“陳老師,您走這兩天,限流模組我按您的註釋寫完了。壓測過了,QPS峰值扛到十八萬,延遲冇超過五十毫秒。”
陳星端起咖啡喝了一口:“不錯。程式碼我晚點review。”
孫浩撓了撓頭,嘿嘿笑了兩聲跑回工位。秦若寒從螢幕上抬起頭,看了陳星一眼,從抽屜裡拿出一盒東西遞過來。
陳星接過來——一盒彩鉛。輝柏嘉的,四十八色,鐵盒裝。
“你上次說想買。正好路過文具店。”
陳星看著那盒彩鉛,沉默了一秒。他上次說“等我買盒彩鉛”是好些天的事,當時隨口一句,自己都快忘了。
“多少錢?我轉你。”
“不用。入職禮物。”
“你入職都半個多月了。”
“那就補的入職禮物。”秦若寒低下頭繼續寫文件,語氣平淡。
陳星握著那盒彩鉛,看著秦若寒的側臉。她的睫毛很長,盯著螢幕的時候微微顫動,手指在鍵盤上敲得飛快,完全冇看他。
“秦若寒。”
“嗯?
“謝謝。”
“不客氣。”她的手指冇停。
陳星把彩鉛放進抽屜,開啟電腦開始review孫浩的限流模組程式碼。辦公區的鍵盤聲此起彼伏,茶水間的咖啡機嗡嗡響著。陽光從落地窗照進來,在地板上鋪成一片暖黃色。
一切都很正常。但陳星總覺得哪裡不對。一種很細微的感覺,像空氣裡多了一種說不清的東西。他停下敲鍵盤的手環顧四周——孫浩在寫程式碼,劉敏在看文件,秦若寒在寫定價方案。所有人都在做自己的事,冇有任何異常。
他收回目光,繼續review程式碼。
下午三點半,孔建明從辦公室走出來,手裡端著他那杯萬年不變的龍井,站在過道裡拍了拍手。
“大家停一下,我說個事。”
辦公區的鍵盤聲停了下來。
“明天上午十點,錦和科技的人來公司做技術交流。錦和科技,就是那個做企業級SaaS的龍頭,市場份額行業前三。他們CTO帶隊,來了一個技術副總裁、兩個架構師、一個產品總監。規格很高。”
辦公區裡響起一陣輕微的騷動。錦和科技,國內企業級SaaS的頭部玩家,客戶覆蓋了百分之六十的五百強企業,去年剛做完D輪融資,估值破百億。跟建明科技根本不在一個量級上。
“他們來乾嘛?”孫浩問。
“他們對我們開放平台的技術方案感興趣,想看看有冇有合作的可能。”孔建明頓了頓,“錦和那邊是通過雲創的陸鳴介紹過來的。陸鳴的原話是——錦和的CTO看了陳星在GitHub上開源的仲裁者方案,想當麵聊聊。”
所有人的目光齊刷刷地看向陳星。陳星靠在椅背上,表情冇什麼變化。
“明天上午十點,大會議室。陳星主講,秦若寒配合。孫浩,你把限流模組的壓測資料整理成PPT。劉敏,寬表設計的架構圖更新一版。其他人,明天著裝正式一點,彆穿拖鞋。”
他轉身走了兩步,又回過頭。
“對了,錦和的CTO叫徐景輝。圈內都叫他‘徐爺’。國內第一代SaaS架構師,脾氣大,眼光高,出了名的不好對付。你們明天彆給我掉鏈子。”
孔建明回了辦公室。辦公區安靜了一秒,然後炸了鍋。
“錦和科技!我的天!”孫浩的臉漲得通紅,“他們那個SaaS平台我大學的時候就在用!徐景輝寫的架構白皮書我們老師當教材講的!”
“彆激動。”劉敏拍了他一下,“明天你是做PPT的,不是追星的。”
“我知道我知道,但那可是徐景輝啊!”孫浩在工位上轉了兩圈,猛地轉向陳星,“陳老師,徐景輝看了您的仲裁者方案!他主動來找您!”
陳星端起咖啡喝了一口:“嗯。”
“您就‘嗯’?那可是徐景輝!”
“他看我的程式碼,又不是我看他的程式碼。緊張什麼。”
孫浩張了張嘴,發現自己無法反駁。秦若寒在旁邊低下頭,嘴角彎了一下。
週四上午九點四十分,建明科技十四樓。
今天的氣氛跟平時完全不一樣。前台小妹換了一身新工裝,頭髮盤得一絲不苟。保潔阿姨把大會議室的玻璃擦了兩遍,連走廊的綠蘿葉子都擦過了。孫浩穿著他唯一一件西裝,袖子有點長,領帶係得太緊,脖子紅紅的。劉敏換了一身深藍色的職業套裝,頭髮紮了起來。秦若寒穿著一件米白色的西裝外套,裡麵是黑色真絲襯衫,頭髮難得地放了下來披在肩上。她站在會議室前麵,把PPT投到巨幕上,又檢查了一遍翻頁筆的電池。
陳星坐在長桌一側,穿的是那套深灰色西裝。秦若寒早上在他工位上留了便簽——“今天穿西裝,錦和的徐景輝看重形式。”他冇有問秦若寒怎麼知道徐景輝看重形式,直接把西裝穿來了。
九點五十分,孔建明站在公司門口,旁邊是陸鳴。陸鳴今天穿了一件深藍色的Blazer,難得地打了領帶。
“徐景輝這個人,我跟他打過三次交道。”陸鳴壓低聲音,“技術冇得說,但脾氣是真的臭。去年雲創跟他們合作一個專案,技術方案評審的時候,他當著二十幾個人的麵,把我們一個架構師罵到自閉。那哥們回去緩了三天才緩過來。”
孔建明看了他一眼:“所以你把錦和引到建明來?”
“不是引,是他們自己找上門的。”陸鳴苦笑,“徐景輝在GitHub上看到了陳星的仲裁者方案,連看了三天,然後給沈爺打了個電話。沈爺說陳星現在在建明,他就讓助理聯絡我了。”
他頓了頓:“沈爺讓我轉告你一句話——陳星這把刀,建明用了一個月。明天,讓錦和也看看這把刀有多快。”
九點五十五分,電梯門開了。
第一個走出來的是一個四十歲左右的男人。身材瘦高,穿著一件深灰色的中式立領襯衫,袖口捲到小臂,露出手腕上一塊老款上海牌手錶。頭髮剪得很短,鬢角有些灰白,臉上的線條硬朗得像刀削出來的。最引人注意的是他的眼睛——不大,但極其銳利,看人的時候像鷹在掃描獵物。
徐景輝。
他身後跟著三個人。一個三十五六歲的女人,穿著一身黑色職業裝,短髮,戴無框眼鏡,是錦和的技術副總裁方敏。兩個三十出頭的男人,一個穿深藍色Polo衫,一個穿淺灰色襯衫,是錦和的架構師何岩和宋鵬。
孔建明迎上去伸出手:“徐總,歡迎。”
徐景輝跟他握了一下手,力道很輕,鬆得很快。目光越過孔建明,在辦公區裡掃了一圈。
“陳星呢?”
冇有寒暄,冇有客套。直奔主題。
“在會議室。”孔建明側身引路。
徐景輝大步往裡走。方敏緊跟在他身後,何岩和宋鵬各拎著一個電腦包,表情嚴肅,像是來參加一場決定生死的答辯。
大會議室的門推開。
徐景輝站在門口,目光在會議室裡掃了一圈,最後落在長桌一側的陳星身上。他看了大約三秒,然後走進去,在陳星對麵坐下來。方敏坐在他旁邊,何岩和宋鵬依次落座。陸鳴和孔建明坐在角落裡,像兩個觀棋不語的看客。
秦若寒站在巨幕旁邊,手裡握著翻頁筆。孫浩坐在最邊上,手指在鍵盤上輕輕發抖。劉敏坐在他旁邊,表情平靜,但手指一直在搓衣角。
陳星坐在徐景輝對麵,雙手交叉放在桌上,表情平靜得像一潭死水。
徐景輝先開口了。
“你的仲裁者方案,我看了三遍。”他的聲音不大,帶著一點南方口音,但每個字都清清楚楚,“思路不錯,工程落地也紮實。TrueTime加HLC加降級方案,這個組合我見過有人提,但冇有人真正實現過。你是第一個。”
會議室裡安靜了一瞬。孫浩的眼睛亮了。
但陳星冇有說話。他知道徐景輝的話還冇說完。
果然。
“不過。”徐景輝的手指在桌麵上輕輕敲了一下,“你的方案有一個致命的缺陷。”
會議室的空氣像被抽走了一半。孫浩的笑容僵在臉上,劉敏的手指停住了,秦若寒握著翻頁筆的手指節微微發白,孔建明端著茶杯的手懸在半空中。
陳星的表情冇有任何變化:“您說。”
“你的仲裁者,依賴Raft做共識。Raft本身是強Leader模型的共識演演算法,在時鐘正常的時候表現很好。但在時鐘異常的時候——尤其是NTP偏差導致的時間戳回退場景——Raft的Leader選舉會產生腦裂。你方案裡寫的‘仲裁者降級觸發後切換到純邏輯時鐘模式’,這個切換過程本身需要共識。而共識依賴Raft。Raft依賴時鐘。”
徐景輝靠回椅背,雙手抱胸。
“這是一個死迴圈。時鐘異常觸發降級,降級需要共識,共識依賴Raft,Raft在時鐘異常時腦裂,無法達成共識,降級失敗。你的方案在極端情況下,會死在自己手裡。”
會議室裡鴉雀無聲。
孫浩的臉色白了。他不太懂那些術語,但他聽懂了“死迴圈”和“死在自己手裡”。劉敏的嘴唇抿成一條線。孔建明端著茶杯的手指微微收緊。陸鳴靠在椅背上,眉頭皺了起來。
秦若寒側過頭看著陳星。她的表情依然平靜,但握著翻頁筆的手指節發白了。
陳星靠在椅背上,沉默了兩秒。
然後他笑了。
不是客套的笑,不是緊張的笑。是那種“你終於問到了”的笑。
“徐總。”他站起來,走到白板前麵,拿起馬克筆,“您說的這個問題,在方案釋出後的第三天,我自己也發現了。”
他在白板上畫了一張新的架構圖。乾淨利落的線條和標註。
“Raft在時鐘異常下的腦裂問題,根源在於Leader選舉依賴超時機製,而超時機製依賴時鐘。要解決這個問題,不是換掉Raft,是在Raft之上加一層‘時鐘無關的選舉觸發機製’。”
他的馬克筆在白板上飛速移動。
“我的方案是——用Paxos的Prepare階段思想,但不引入Paxos的完整複雜度。在仲裁者集群中,每個節點維護一個本地的‘降級計數器’,這個計數器不依賴時鐘,隻依賴事件。當一個節點檢測到時鐘異常時,它不直接觸發降級,而是向所有節點廣播一條‘降級提議’訊息。節點收到提議後,不比較時間戳,隻比較本地計數器的值。計數器值最大的提議獲勝。”
他畫了一個簡單的流程圖。
“這個機製的本質是——用事件的因果關係替代時間的先後關係。時鐘異常了,但事件的因果順序不會亂。A節點先檢測到異常,B節點後檢測到,這個‘先’和‘後’是由事件傳播的因果鏈保證的,不是由時鐘保證的。”
他放下馬克筆,轉身看著徐景輝。
“就像五個盲人同時聽到一聲巨響。他們的手錶都停了,不知道巨響發生的準確時間。但他們不需要知道時間——隻需要知道誰先喊出‘我聽到了’。先喊的那個人,大家就跟著他走。”
徐景輝的眼神變了。不再是審視,而是一種被點燃的東西。
“降級切換的延遲是多少?”
“理論上,三輪訊息往返。在實際網路條件下,大約四十到六十毫秒。”
“降級期間的事務怎麼處理?”
“排隊等待。仲裁者降級切換的四十到六十毫秒內,新到達的事務請求進入等待佇列。切換完成後,用純邏輯時鐘的時間戳批量處理。對呼叫方來說,隻是一次稍長的響應延遲,不會丟事務,不會錯序。”
“等待佇列的容量?”
“預設一萬,可配置。超過容量觸發流控,返回‘係統繁忙’錯誤碼。這個錯誤碼是十二種錯誤碼之一。”
徐景輝沉默了兩秒。然後他問出了最後一個問題。
“如果降級切換期間,正好有一個事務的prepare已經發出、commit還冇到達,怎麼辦?”
陳星的馬克筆停了一下。他看著徐景輝,嘴角微微彎起來。