作者:温水煮茶
苏执把笔记本放在自己面前的小桌板上,指尖在触控板上点了几下,打开一个空白的编辑器,一边敲一边说:“方案有很多,数据库悲观锁、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能力嵌入生物医疗的每一个环节,从算法模型搭建到数据处理流程,为白霜序的研发提供技术支撑。
一个管研发方向, 一个管技术落地。一个懂生物医疗的每一个细节,一个懂算法的每一种可能。两人以妻妻之名,行创业之实, 分工明确,各司其职。
注册那天,工作人员把营业执照打印出来,习惯性地说了句“恭喜”,目光落在“法定代表人”和“监事”两个名字上,顿了一下,又抬头看了一眼柜台前的两个人。
白霜序站在前侧,姜漾站在她旁边,两个人的手不知道什么时候牵在了一起,没有刻意炫耀,只是十指自然相扣,松弛、亲昵、理所当然。
工作人员是一个四十多岁的女人,在这个行政大厅干了十几年,见过各种各样的公司注册——夫妻店、兄弟档、父子兵、朋友合伙,但两个女人以妻妻之名注册公司,这还是头一回。更别说注册资金后面那一串零,五千万,实缴。
她又看了一眼那两个字:妻妻。
“二位是……”她不是多嘴的人,却下意识问了这么一句,并非恶意,纯属震惊。
白霜序看眼姜漾,微微点了下头,“是的,我们刚在国外领的证。”
工作人员愣了两秒,然后笑起来,这次的笑容比刚才真了很多,不是程式化的那种。她把营业执照双手递过去,说了一句跟刚才不一样的话:“恭喜你们,祝公司越办越好。”
白霜序接过执照,低头看了一眼。法定代表人:白霜序。监事:姜漾。关系:妻妻。
那两个字印在纸上,黑色的宋体,端端正正的,她转手,把执照递给姜漾。
姜漾接过去,对着光看了一会儿,嘴角的弧度怎么都压不下去。她把执照翻来覆去地看了两遍,忽然凑近白霜序,声音压得很低:“白总。”
白霜序看了她一眼,笑着回应:“姜总。”
两人对视笑着,眼睛里全是彼此。
白霜序拿过姜漾手里的文件袋,小心收起来,然后伸出手。
“走了,去看看苏总监。”
姜漾把手放进她掌心里,两人十指交握出门,驱车去医院。
医院里,苏执正在亲自盯明灿项目,明灿这两天被训练成了魔鬼,苏执精神头好一点,睁眼闭眼就是代码。
早上睁眼第一句话:昨晚那个bug改完了吗?
闭眼之前最后一句话:明天把那个接口重构一遍!
明灿有时候觉得苏总监不是在住院,是把病房搬过来当办公室用,而她是那个被按在工位上的倒霉实习生。
但她也知道,苏执是真的在用心教她。不是那种随便指指点点的教,是把她写的每一行代码都看过、每一个逻辑都推演过、每一个可能的漏洞都提前想到过的教。
明灿觉得又苦又甜,身体上苦,心灵上甜。
病房门被敲响的时候,明灿正对着屏幕上的一段死锁代码抓耳挠腮。苏执在旁边没有出声,大概是在给她时间自己琢磨,听到敲门声才抬起眼睛,说了句“进来”。
门被推开,白霜序和姜漾一前一后走进来。
白霜序手里拎着一个果篮,姜漾跟在她后面,怀里抱着一束花,两个人身上还带着外面盛夏的暑气,一进门就把空调的冷风搅动了一下。
姜漾把花放到床头柜上,目光落在明灿身上,又看了一眼苏执半靠在床上的姿势和小桌板上亮着的电脑屏幕,嘴角一弯,语气里带着明显的幸灾乐祸:“灿灿好惨啊,住院部都变成自习室了。”
明灿听到“灿灿”两个字,手指在键盘上顿了一下,下意识回过头,一脸认同地就要点头。
然后她看到了苏执斜视的目光。
不重不轻,不带任何情绪,甚至没有皱眉,但明灿就是觉得后背一凉。
她点头的动作做到一半硬生生卡住,脖子一缩,整个人矮了半截,飞快地转回去,眼睛重新盯回屏幕,手指噼里啪啦地敲起来。
“没有没有,我自己要学的,姐姐身体不好还教我,我感激还来不及。”她一口气说完,连标点符号都来不及加。
姜漾愣了一秒,然后笑得弯了腰,一只手搭在白霜序肩上,笑得眼泪都快出来了。
白霜序没有笑,但嘴角的弧度出卖了她,她侧过脸看了苏执一眼,苏执的表情没有任何变化,还是那副淡淡的、什么情绪都没有的样子。
但如果是关系贴近的朋友其实是能看得出来,她在逗明灿。
两人没有拆穿。
姜漾笑够了,擦了擦眼角,搬了把椅子坐到明灿旁边,凑过去看她的电脑屏幕,看了一眼就收敛了笑意,认真起来:“这个分布式锁的续期机制,你写的?”
明灿点头,声音里带着一点被苏执折磨过后的小心翼翼:“姐姐给我讲了思路,我自己实现的。”
姜漾又看了几行,点了点头,语气里多了一点认真:“思路是对的,实现上还有优化空间。”她伸出手,在触控板上点了几下,翻到另一个文件,“不过你这个并发处理的方式已经比很多工作两三年的都好了。”
“真的吗?”明灿眼睛亮了一下,但很快又收敛回去,因为她感觉到苏执的目光还落在她身上,不重,但存在感极强,像一盏无声的探照灯。
她不敢飘,老老实实低下头,继续改代码。
白霜序把果篮放到床头柜上,拉过另一把椅子坐下来,看了一眼苏执手背上贴着输液贴,又看了一眼她比上次见面时稍微好了一点的气色,没有说那些“恢复的还不错”之类的废话,只是从包里拿出一个文件袋,递了过去。
苏执接过去,打开,抽出里面的东西。
是一张营业执照的复印件。
法定代表人:白霜序。监事:姜漾。关系:妻妻。
苏执的目光在“妻妻”两个字上停了两秒,然后把复印件放回文件袋里,合上,递还给白霜序,声音不紧不慢:“恭喜。”
白霜序接过文件袋,嘴角弯了一下:“就两个字吗?”
“够了。”苏执说。
姜漾在旁边忍不住笑出声来,凑过来补充道:“不止开公司,我们还领证了,就在这两天,飞国外办的,来回只花了一天多。”
她说这话的时候语气里全是藏不住的得意,眼角眉梢都是光,像是把“我结婚了”这四个字写在脸上,恨不得全世界都知道。
明灿在旁边听得一愣一愣的,手指从键盘上抬起来,嘴巴张成一个O型,好半天才憋出一句话:“就两天!姜漾姐你们效率好高啊,两天内既领证又开公司!”
“羡慕啊!”姜漾在旁边,声音懒懒的,“羡慕的话你们俩也抓紧呗!”
“我们俩?”明灿有点没反应过来。
姜漾看眼苏执:“对啊,你跟苏总监啊!别告诉我你们俩这么亲密,又是讲题又是留遗产的,不是在谈对象。”
“没有没有,”明灿摆摆手,脸颊有一瞬间的泛红,说话的同时,下意识用余光偷瞟苏执。
苏执反应平平,那张脸上甚至没有什么多余的表情,隔了差不多几秒,她抬眼看向姜漾,语气不重,但每个字都清清楚楚:“姜漾,不要乱说。”
姜漾张了张嘴,还想说点什么,被白霜序轻轻按了一下手背,便把到嘴边的话咽了回去,只耸了耸肩,靠回椅背里。