書境
第52頁
明燦彎起眼睛笑了下,把空碗收進保溫袋裡,又把桌上的橘子皮收拾乾淨,拿溼巾把桌面擦了一遍,最後把水杯拿起來,重新接了半杯溫水遞過去。
“姐姐,我今天做哪個模組?昨天你讓我改的那幾個bug我都改的差不多了。”
“分散式鎖。”蘇執說,接過明燦遞來的水杯,但沒有喝,只是捧在手裡,指腹摩挲著杯壁,“昨天你做的那個定時任務,在多例項部署的情況下會重複執行。”
明燦眨了下眼睛,手裡還捏著半瓣橘子,頓住了。
她做的那個定時任務,是每天早上三點統計前一天的運營資料。在本地開發環境跑得好好的,但她心裡清楚,蘇執說的問題確實存在——如果生產環境部署了多個服務例項,每個例項都會在三點觸發同一個任務,重複寫入資料,輕則資料冗餘,重則邏輯錯亂。
“所以需要分散式鎖。”蘇執把水杯放到床頭櫃上,伸手去夠床頭櫃上的筆記本,明燦趕緊放下橘子,把電腦遞過去。
蘇執把筆記本放在自己面前的小桌板上,指尖在觸控板上點了幾下,開啟一個空白的編輯器,一邊敲一邊說:“方案有很多,資料庫悲觀鎖、Redis的setnx、Zookeeper的臨時順序節點,你用哪個?”
明燦湊過去看,蘇執的手指在鍵盤上敲得很快,一行一行的基礎程式碼出現在螢幕上,不是完整的實現,而是一個骨架——鎖的介面定義、加鎖解鎖的基本流程、異常處理的框架。
“Redis。”明燦說,語氣裡帶著一點不確定,“用setnx,配合lua指令碼保證原子性,設定過期時間避免死鎖。”
蘇執停下來,側過臉看了她一眼。那一眼很淡,但明燦覺得自己被從頭到腳審視了一遍,像面試時被技術總監盯著等回答的那種感覺,心跳不由自主地加快了幾拍。
“繼續。”蘇執說。
明燦深吸一口氣,開始說:“加鎖的時候用setnx,如果返回成功就拿到鎖,同時設定一個過期時間比如三十秒。如果返回失敗說明鎖被其他例項佔用,可以重試或者直接放棄。鎖的持有者需要在業務邏輯執行完之後釋放鎖,刪除對應的key。為了防止A執行緒的鎖被B執行緒釋放,value要用一個唯一標識,比如UUID或者執行緒ID,釋放的時候先get再判斷,匹配了才能del。”
她說完,怯生生看著蘇執。
蘇執沒有立刻表態,低下頭在鍵盤上又敲了幾行,然後把螢幕轉向明燦。
螢幕上是一個完整的Redis分散式鎖實現,用lua指令碼把判斷和刪除兩個操作合併成一個原子操作,避免了get和del之間的時間視窗。明燦一行一行地看,看到最後一行的時候,發現蘇執還在程式碼末尾加了一行註釋:// 考慮使用Redisson的RLock,自動續期機制更優雅。
明燦盯著那行註釋看了兩秒,然後抬頭看蘇執:“姐姐,你這是……在教我寫程式碼,還是在給我做程式碼審查?”
“都是。”蘇執的聲音很淡,但嘴角有一個極其細微的弧度,像是剋制過但沒完全剋制住,“你剛才說的方案裡,漏了一個關鍵問題。”
明燦愣了:“什麼?”
“鎖過期了但業務還沒執行完怎麼辦?”
明燦張了張嘴,又閉上了。
她確實漏了這個。
如果設定的過期時間是三十秒,但業務邏輯執行了四十秒,那麼鎖在第三十秒的時候就會自動釋放,另一個例項拿到鎖進來執行同樣的任務,等第一個例項執行完再釋放鎖的時候,釋放的是第二個例項的鎖。後果很嚴重——鎖的持有者被誤刪,第二個例項以為自己還有鎖,實際上鎖已經被別人幹掉了。
“所以需要鎖續期。”蘇執說,“拿到鎖之後啟動一個後臺執行緒,每隔一段時間檢查一下鎖是否還在,如果還在就延長過期時間。業務執行完再取消續期,釋放鎖。”
明燦聽得認真,眉頭微微皺著,腦子裡在消化這個方案。她想了想,問了一個問題:“那如果持有鎖的例項突然宕機了,續期執行緒也掛了,鎖是不是就永遠不釋放了?”
蘇執看了她一眼,那一眼裡多了一點東西——不是誇獎,但比誇獎更讓明燦受用,那是一種“你終於開始想邊緣情況了”的認可。
“所以Redis分散式鎖有一個經典的缺陷,就是這個問題。嚴格意義上來說,它做不到百分之百的絕對安全,只能做到百分之九十九點九九。”蘇執的語氣不緊不慢,像在講一門精心準備過的課,“如果需要更高的一致性,可以考慮Zookeeper或者etcd,它們的分散式鎖是基於臨時順序節點和會話心跳實現的,客戶端宕機了節點會自動刪除,不會有死鎖問題。”
她說完,停了一下,看著明燦。
明燦在筆記本上飛快地記著,寫到一半忽然抬頭:“姐姐,你這些東西你剛開始接觸的時候都是在哪學的?我們學校好像都沒教過這麼深。”
蘇執沒有回答,靠回枕頭上,把目光移向窗外。陽光把窗框的影子投在地面上,明晃晃的一片。
“自己看的。”她過了好一會兒才說,聲音比之前輕了一些,“分散式系統設計,網上有很多資料,我那個時候沒人教。”
明燦看著她的側臉,忽然覺得心裡有一種說不清的感覺在往外湧。蘇執這個人,話不多,從不炫耀自己懂什麼、會什麼,但每次她開口說出來的東西,都讓明燦覺得——這個人好像什麼都知道,什麼都考慮過,什麼邊緣情況都在她的腦子裡演練過了。
但轉眼又一想,她那個時候沒人教,什麼都帶靠自己,熬通宵,啃厚厚的書籍,網上查資料,她那麼辛苦,那麼累,才有了今天博學一切的程度。
而這樣的博學一切的人,現在半靠在病床上,手背上還貼著輸液貼,在用一種極其耐心的方式,把那些她花了很多年才學會的東西,一點一點講給她聽。
蘇執將膝上型電腦往推明燦那邊挪了下,靠回枕頭上,聲音淡下來:“按照我說的思路,自己試一下,給你一早上的時間,想通這個問題,做出方案給我看!”
“好。”
明燦小聲應下,把筆記本拉到自己面前,螢幕上還留著蘇執剛才敲的那段骨架程式碼。她沒有急著動手,而是先把蘇執說的那幾個關鍵點在心裡過了一遍——鎖續期、宕機處理、原子性保證——然後才把手指搭上鍵盤,開始一行一行地寫。
寫的同時,她也在想一個問題,蘇執這個人真的很奇怪,明明剛才還在溫柔地喝著粥、慢慢地吃著橘子,下一秒就能切換成工作狀態,語氣不冷不熱,表情不鹹不淡,像一臺精密的機器被人按下了開關。
但神奇的是,她並不覺得這樣的蘇執有距離感。
反而覺得安心。
作者有話說:
猜一猜蘇總監親自帶出來的燦燦,將來會花落哪個廠呢?
第44章
最近事情似乎都在往好的方向發展, 白霜序帶姜漾回了一趟白家,敞開心扉跟父親談了一下,白非居然奇蹟般地同意了她創業的想法, 還撥了一筆啟動資金過去。
白霜序拒絕了, 說資金的事自己會想辦法, 如果後期有專案需要政府資源支援,還請父親幫忙牽線搭橋,白非答應了, 兩人從白家出來, 白霜序轉頭就去找了母親, 從自家老媽手裡套了一大筆的啟動資金。
然後第二天,她帶姜漾飛了一趟國外,來回只花了一天多的時間,落地、登記、宣誓、領證,一套流程全部搞定, 回來後,兩人以妻妻之名註冊了一家科技公司。
——漾序生物醫療科技有限公司。
註冊資金5000萬元。白霜序為創始人兼CEO,全面負責公司戰略規劃、融資對接與日常運營管理,同時作為生物醫療研發的核心主導者,親自把控技術研發方向與產品落地。
她的妻子姜漾, 出任研發部技術長(CTO)兼AI演算法工程師,負責將AI能力嵌入生物醫療的每一個環節,從演算法模型搭建到資料處理流程,為白霜序的研發提供技術支撐。
一個管研發方向, 一個管技術落地。一個懂生物醫療的每一個細節,一個懂演算法的每一種可能。兩人以妻妻之名,行創業之實, 分工明確,各司其職。
註冊那天,工作人員把營業執照列印出來,習慣性地說了句“恭喜”,目光落在“法定代表人”和“監事”兩個名字上,頓了一下,又抬頭看了一眼櫃檯前的兩個人。
白霜序站在前側,姜漾站在她旁邊,兩個人的手不知道什麼時候牽在了一起,沒有刻意炫耀,只是十指自然相扣,鬆弛、親暱、理所當然。
工作人員是一個四十多歲的女人,在這個行政大廳幹了十幾年,見過各種各樣的公司註冊——夫妻店、兄弟檔、父子兵、朋友合夥,但兩個女人以妻妻之名註冊公司,這還是頭一回。更別說註冊資金後面那一串零,五千萬,實繳。
她又看了一眼那兩個字:妻妻。
“二位是……”她不是多嘴的人,卻下意識問了這麼一句,並非惡意,純屬震驚。
找不到符合的作品。