【第25章 能不能抽到其中一個】
------------------------------------------
週四上午九點半,陳星開車到雲創科技。
今天他冇有穿西裝,換回了深藍色Polo衫和卡其色休閒褲。倒不是因為西裝不舒服,而是他覺得在技術評審會上穿西裝太正式了,跟一群穿T恤的程式員坐在一起格格不入。
十八樓,雲汐專案組的大會議室。
陳星推門進去的時候,裡麵已經坐了十幾個人。周誌遠坐在最前麵,白板上畫滿了TSO方案的拆解圖,比陳星之前畫的還要詳細。王哲坐在角落裡,麵前擺著膝上型電腦,螢幕上是一個半成品的demo。其他人有的在翻技術文件,有的在小聲討論,整個會議室裡瀰漫著一種技術人特有的專注氛圍。
看到陳星進來,所有人都抬起了頭。
“陳老師!”周誌遠站起來,臉上帶著一種壓抑不住的興奮,“我們把您的方案拆了一遍,發現了好幾個我們之前完全冇想到的優化點。您看——”
他走到白板前麵,指著其中一張圖:“比如這個TrueTime和HLC的結合部分。我們原來的理解是,TrueTime負責全域性時間戳,HLC負責區域性因果關係。但昨天王哲在寫demo的時候發現,如果讓HLC也參與全域性時間戳的校驗,可以把時鐘偏差的檢測精度再提升一個數量級。”
陳星走到白板前麵,仔細看了看周誌遠的拆解圖。看了大約半分鐘。
“這個思路是對的。”他拿起馬克筆,在圖上加了兩筆,“但有一個問題——HLC的物理時鐘部分本身就是依賴TrueTime的,如果你讓HLC反向校驗TrueTime,會形成一個閉環。閉環的收斂速度不夠快,在極端情況下會產生震盪。”
周誌遠的表情從興奮變成了沉思。
陳星繼續在圖上畫:“解決方案是加一個‘仲裁者’角色。不依賴HLC去校驗TrueTime,而是在兩者之上再加一層——專門的時間戳仲裁服務。它同時接收TrueTime和HLC的輸入,用一個簡單的多數表決機製來判斷當前時鐘是否可信。”
他在白板上畫了一個新的架構圖。
“仲裁者本身不產生時間戳,隻做判斷。判斷邏輯很簡單:如果TrueTime返回的時間區間,和HLC推斷的時間區間,重合度超過百分之九十,就認為時鐘正常。如果低於百分之九十,觸發降級,切換到純邏輯時鐘模式。”
會議室裡安靜了幾秒。
然後王哲猛地站了起來:“這樣的話,仲裁者本身會不會成為新的單點?”
“好問題。”陳星看了他一眼,眼神裡有欣賞,“仲裁者可以部署多個例項,用Raft做共識。隻要半數以上例項存活,仲裁服務就可用。而且仲裁者的邏輯非常輕量,單機就能支撐每秒百萬級的判斷請求。”
王哲坐回去,嘴裡唸唸有詞,手指在空中比劃著,顯然在腦子裡推演這個方案的可行性。
周誌遠站在白板前麵,盯著陳星補充的那張圖,沉默了很久。
然後他轉過身,對著會議室裡所有人說了一句:“大家把今天的討論全部記錄下來。陳老師剛纔補充的這個仲裁者方案,是我們之前完全冇有想到的維度。”
他頓了頓,語氣變得認真起來:“我在雲創乾了三年,參與過大大小小十幾個專案的架構評審。今天這種‘我以為我懂了,其實我隻懂了皮毛’的感覺,是第一次。”
陳星笑了笑:“周老師,彆這麼說。你們能把TrueTime和HLC的結合拆到這個程度,已經很厲害了。我隻是在你們的思路上加了一塊磚。”
“您這塊磚,夠我們研究一個月。”周誌遠苦笑。
———
技術評審會開到中午十二點半才結束。
陳星走出會議室的時候,周誌遠追了出來。
“陳老師,我能問您一個私人問題嗎?”
“問。”
“您到底是怎麼學的?”周誌遠的眼神很真誠,冇有嫉妒,冇有不服,隻有純粹的好奇,“我乾這行十二年,見過不少大牛,但像您這樣的,真的冇見過。二十一歲,高中學曆,分散式係統、資料庫核心、高併發架構,無一不精。您到底是怎麼做到的?”
陳星停下腳步,看著周誌遠。
“周老師,我跟您說實話。”他的聲音不大,但很認真,“我冇有什麼特殊的學習方法。我隻是把彆人覺得‘差不多懂了’的東西,繼續往下挖。大多數人看懂論文的摘要和結論就停了,我會把引用文獻也翻出來看。大多數人會用開源框架就滿足了,我會把框架的原始碼拉下來讀。大多數人在遇到問題的時候會繞過去,我會跟它死磕。”
他頓了頓:“這些東西,不需要天賦,需要的是時間和耐心。隻不過大多數人冇有那個耐心,所以顯得有耐心的人像天才。”
周誌遠站在原地,把陳星說的每一個字都記在了心裡。
他忽然想起自己去年看過的一篇分散式係統論文,當時覺得“差不多懂了”就放下了。現在回想起來,那篇論文的第四節,好像也提到過類似仲裁者的思路。但他當時跳過了,冇有細看。
“陳老師,”周誌遠的聲音有點啞,“謝謝您。不隻是謝謝您今天的方案,謝謝您讓我知道,我以為的努力,其實還不夠努力。”
陳星拍了拍他的肩膀:“周老師,您已經比大多數人努力了。隻是——”他笑了一下,“我比您更變態而已。”
周誌遠愣了一下,然後哈哈大笑。
———
下午,陳星迴到建明科技。
剛進辦公區,孫浩就衝了過來,臉上帶著一種“出大事了”的表情。
“陳老師!孔總讓您去他辦公室一趟!好像是雲創科技那邊的人來了!”
陳星挑了挑眉,走向孔建明的辦公室。門冇關,裡麵坐著三個人——孔建明、陸鳴,還有一個陳星冇見過的中年男人。
“陳星,來來來。”孔建明招呼他進去,“這位是雲創科技的CTO,方卓然方總。方總,這就是陳星。”
方卓然站起來,伸出手。他看起來五十歲左右,頭髮花白,戴著一副老式的黑框眼鏡,穿著一件洗得發白的格子襯衫。整個人看起來不像CTO,更像大學裡那種埋頭做學問的老教授。
“陳星,久仰。”方卓然的聲音不大,帶著一點南方口音,“你那個TSO方案,陸鳴給我看了。說實話,我做了二十年資料庫,你那個方案裡的好幾個思路,是我最近在思考但還冇想清楚的方向。”
陳星跟他握了握手:“方總過獎了。”
“不是過獎。”方卓然坐下來,推了推眼鏡,“我今天來,是想當麵跟你聊一個事情。雲汐的事務管理器,按你的方案重構,技術上冇有問題。但有一個現實問題——現有的客戶怎麼辦?”
他從公文包裡拿出一份檔案,攤在桌上。
“雲汐目前有四百多家付費客戶,其中三十多家是大型企業。如果我們重構事務管理器,API介麵必然會發生變化。這三十多家大客戶,每一家都有自己的技術團隊,讓他們配合改介麵,難度非常大。”
陳星接過檔案翻了翻,是一份客戶清單和對應的技術對接人。三十多家大客戶,涉及金融、政務、物流、電商等多個行業。每一家都有定製化的接入方案。
“方總,您的意思是?”
“我的意思是——能不能在不改變現有API的前提下,完成底層重構?”方卓然的目光透過厚厚的鏡片,落在陳星臉上,“我知道這個要求很苛刻,但從商業角度,這是最優解。”
辦公室裡安靜了幾秒。
孔建明端起茶杯喝了一口,冇有說話。陸鳴靠在沙發上,表情有些緊張。他知道這個要求有多難——等於讓陳星戴著鐐銬跳舞。
陳星冇有說話。他把那份客戶清單從頭到尾翻了一遍,然後合上檔案,靠在椅背上,閉上了眼睛。
大約過了半分鐘,他睜開眼睛。
“可以。”
方卓然的眉毛微微揚起:“你確定?”
“可以。”陳星重複了一遍,聲音很平靜,“API不變,底層重構。需要多花兩週時間,在中間加一層協議適配層。適配層負責把老API的請求翻譯成新架構的呼叫,同時保證語義完全一致。”
他拿起筆,在方卓然帶來的檔案背麵畫了起來。
“適配層分三部分。第一,請求翻譯器——把老API的請求引數對映到新架構的介麵。第二,結果轉換器——把新架構的返回結果轉回老API的格式。第三,異常對映器——把新架構的異常碼對映回老API的錯誤碼,保證客戶端的錯誤處理邏輯不受影響。”
他畫完之後,把紙推給方卓然。
“適配層本身是無狀態的,可以水平擴充套件。效能損耗在百分之五以內。兩週能寫完。”
方卓然盯著那張手繪的架構圖看了很久。
然後他摘下眼鏡,用衣角擦了擦鏡片,重新戴上。這個動作他重複了兩遍。
“陳星,”他的聲音有點啞,“你知道我剛纔在想什麼嗎?”
“什麼?”
“我在想,如果我年輕二十歲,遇到你這樣的人,我會毫不猶豫地拜你為師。”
辦公室裡安靜了一瞬。
陸鳴在旁邊看得目瞪口呆。方卓然是什麼人?國內資料庫領域的前輩級人物,當年一個人寫了國內第一個商用的關係型資料庫。整個雲創科技的技術體係,有一半是他搭起來的。沈嶽見了他都要客客氣氣叫一聲“方老師”。
現在他說,想拜陳星為師。
雖然是“如果年輕二十歲”的假設,但能從方卓然嘴裡說出來,本身就已經是最高階彆的認可了。
陳星站起來,雙手把那張紙遞過去:“方老師,您這話我擔不起。我這些東西,都是從您那代人的論文和程式碼裡學來的。要說師父,您纔是師父。”
方卓然接過那張紙,看著陳星,笑了。那笑容裡有欣慰,有釋然,還有一種“後繼有人”的滿足。
“好。好。”他連說了兩個好字,站起來拍了拍陳星的肩膀,“陳星,我在雲創等你。等你正式入職那天,我請你喝酒。”
“一定。”
———
晚上十點,陳星迴到出租屋。
他今天冇加班太晚,因為明天還有一場硬仗——資料中台的效能壓測。孫浩和劉敏已經準備了一週,明天是全鏈路壓測的日子。
他洗完澡躺在床上,開啟手機,看到陳月發來的一條訊息。
“哥!我今天用你給我的iPad畫了一幅畫!給你看!”
下麵是一張圖片。畫的是一個方方正正的黑色越野車,車旁邊站著一個高高瘦瘦的男生,穿著藍色衣服。畫風很稚嫩,線條歪歪扭扭的,但能看出來畫的是什麼。
大G,和他。
陳星盯著那張畫看了很久。
然後他回了一條:“畫得不錯。就是人畫醜了。”
陳月秒回:“你本來就醜!!!”
“行,我醜。早點睡。”
“哥你也早點睡。彆天天加班。”
“知道了。”
他把手機放在床頭,雙手枕在腦後,看著天花板。
明天,全鏈路壓測。後天,累計獎勵突破二十億,第二次抽獎。
每一天,都在變得更強。
他閉上眼睛,嘴角帶著一絲笑意,沉沉睡去。
———
週五,全鏈路壓測。
建明科技十四樓,技術部全員到齊。孔建明親自坐鎮,秦若寒站在監控大屏前麵,手裡拿著對講機。整個辦公區的氣氛緊張而有序,像發射火箭前的指揮大廳。
陳星坐在自己的工位上,麵前三塊顯示屏——一塊是壓測的實時QPS曲線,一塊是各模組的CPU和記憶體監控,一塊是錯誤日誌。他戴著頭戴式耳機,手裡握著滑鼠,表情平靜得像一潭死水。
“壓測開始。”秦若寒的聲音從對講機裡傳出來。
螢幕上,QPS曲線開始爬升——一千、五千、一萬、兩萬、三萬……
“資料采集模組正常。”
“訊息佇列積壓為零。”
“實時計算延遲一點二秒,在閾值內。”
“API閘道器響應時間九十五毫秒。”
各模組的負責人依次彙報。陳星冇有說話,目光在三塊螢幕之間來回掃動。
QPS爬到五萬的時候,一條紅色的報警線突然跳了出來。
“寬表查詢模組延遲飆升!從一百毫秒跳到了三秒!”劉敏的聲音從耳機裡傳來,帶著一絲緊張。
所有人的目光都看向陳星。
陳星切換螢幕,點開寬表查詢模組的監控麵板。隻看了不到五秒。
“不是查詢的問題,是ClickHouse的part合併觸發了。”他的聲音不大,但每個人都聽得清清楚楚,“壓測之前灌入了大量資料,ClickHouse在後台自動做part合併,占用了IO資源。正常現象,合併完成後延遲會降下來。”
他敲了幾個命令,調出ClickHouse的後台合併任務狀態。
“合併進度百分之六十三,預計還有一分半完成。壓測繼續,不用停。”
一分半後,紅色報警消失。寬表查詢延遲迴落至一百毫秒以內。
QPS繼續爬升——八萬、十萬、十二萬……
“訊息佇列出現短暫積壓!”孫浩的聲音緊張起來。
陳星切到訊息佇列監控:“積壓量多少?”
“一千兩百條。”
“正常波動,消費者處理速度跟得上。繼續。”
積壓量在一分鐘內被消化完畢。
QPS爬到十五萬的時候,陳星終於開口了。
“壓測目標達成,可以停了。”
秦若寒的聲音從對講機裡傳來:“壓測停止。”
螢幕上的QPS曲線從高峯迴落,最終歸零。整個辦公區安靜了一瞬,然後爆發出震天的歡呼聲。
孫浩從工位上跳起來,跟旁邊的同事抱在一起。劉敏癱在椅子上,長長地撥出一口氣,眼眶有點紅。其他人有的擊掌,有的捶桌子,有的大喊“牛逼”。
孔建明站起來,走到陳星工位旁邊,用力拍了拍他的肩膀,什麼都冇說,但眼眶裡有一點亮光。
秦若寒從監控大屏前走過來,伸出手:“陳老師,恭喜。”
陳星跟她握了握手:“同喜。你那個資料看板的配置介麵,壓測全程冇有觸發任何錯誤,產品設計得很穩。”
秦若寒笑了一下:“被程式員罵出來的。”
———
晚上,孔建明在“雲廬”訂了最大的包間,全組慶功。
觥籌交錯間,陳星被灌了不少酒。他的酒量一般,喝到第四杯的時候臉就紅了。但他冇有拒絕任何人的敬酒——孫浩的、劉敏的、秦若寒的、孔建明的,每一個他都喝了。
散場的時候已經快十一點了。陳星叫了代駕,靠在副駕駛上,車窗搖下來一條縫,夜風吹在臉上,酒意散了一些。
手機震了。係統在淩晨的統計不會因為他喝酒就推遲。
零點整。
叮。
【淩晨統計:今日打工收入——建明科技15325元,雲創科技顧問費100000元,合計115325元。千倍獎勵:115,325,000元。獎勵已發放至係統賬戶。】
一億一千五百三十二萬。
【當前累計打工收入:約188.4萬元。累計獲得獎勵:約18.84億元。】
【距離下一次抽獎(累計20億獎勵)還需約1.16億元。】
陳星盯著那個數字,嘴角慢慢彎了起來。
一億一千六百萬。按現在的速度,明天,累計獎勵就能突破二十億。
明天,第二次抽獎。
大G在夜色中平穩行駛。城市的燈火從車窗外飛速後退,像一條發光的河。陳星靠在座椅上,閉上眼睛,腦子裡浮現出那個巨大的虛擬輪盤。
思維輸入。時間感知。絕對記憶。
能不能抽到其中一個?