|
她把剥好的橘子放在纸巾上,推到苏执手边。 “姐姐先喝粥,喝完再吃橘子。”她说,语气认真得像在交代医嘱。 苏执看了她一眼,没有说话,低下头继续喝粥。 明灿又剥了一个,自己吃了一瓣,酸得眯了一下眼睛,然后又把剩下的几瓣放到苏执那边的纸巾上,嘟囔了一句:“这个有点酸,不过酸一点也好,补充维生素C。” 苏执把粥喝了大半碗,放下勺子,伸手拿起一瓣橘子。 橘子很小,砂糖橘本来就比普通橘子小一点,剥掉橘络之后更显得玲珑,橙黄色的果肉在光线下几乎是透明的。她放进嘴里,咬破的瞬间汁水溢出来,很甜,几乎没有酸味,甜到舌尖微微发麻。 “甜的。”她说。 明灿愣了一下,然后笑起来,颇为自豪的语气:“那当然,我尝过的嘛,不甜我不会买的!” 苏执没有接这句话,又拿起一瓣橘子,慢慢地吃。 她生病后,吃东西本来就艰难,此时一点一点吮着橘子里面的汁水,明灿相比就吃的快了很多,一口一个橘子瓣,一口又一个橘子瓣,一颗橘子她三两下就吃完了,吃完又扒。 两个人就这样面对面地吃着早餐,一个慢慢地喝粥吃橘子,一个风卷残云地把自己那碗粥解决掉,又喝了半杯水,然后心满意足地靠在椅背上,看着苏执吃。 “姐姐。”明灿忽然叫了一声。 苏执抬起眼睛。 “你今天气色比昨天好多了。”明灿说这句话的时候目光很认真,不是在客气或者安慰,是真的在认真地看她的脸,从眉骨看到颧骨,从颧骨看到下巴,最后落在嘴唇上,“嘴唇也不那么白了。” 苏执垂下眼,把最后一瓣橘子放进嘴里,咽下去之后才说:“嗯,今天感觉好一些。” 她说得很平淡,语气里没有劫后余生的庆幸,也没有久病初愈的感慨,就像在陈述一个天气一样的事实。但明灿听得出来,那句话说出口的时候,苏执的声音比前几天稳了很多,不再像风里的纸片那样轻飘飘的。 明灿弯起眼睛笑了下,把空碗收进保温袋里,又把桌上的橘子皮收拾干净,拿湿巾把桌面擦了一遍,最后把水杯拿起来,重新接了半杯温水递过去。 “姐姐,我今天做哪个模块?昨天你让我改的那几个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能力嵌入生物医疗的每一个环节,从算法模型搭建到数据处理流程,为白霜序的研发提供技术支撑。 一个管研发方向, 一个管技术落地。一个懂生物医疗的每一个细节,一个懂算法的每一种可能。两人以妻妻之名,行创业之实, 分工明确,各司其职。 注册那天,工作人员把营业执照打印出来,习惯性地说了句“恭喜”,目光落在“法定代表人”和“监事”两个名字上,顿了一下,又抬头看了一眼柜台前的两个人。 白霜序站在前侧,姜漾站在她旁边,两个人的手不知道什么时候牵在了一起,没有刻意炫耀,只是十指自然相扣,松弛、亲昵、理所当然。 工作人员是一个四十多岁的女人,在这个行政大厅干了十几年,见过各种各样的公司注册——夫妻店、兄弟档、父子兵、朋友合伙,但两个女人以妻妻之名注册公司,这还是头一回。更别说注册资金后面那一串零,五千万,实缴。
福书网:www.fushutxt.cc免费全本完结小说在线阅读!记得收藏并分享哦!
109 首页 上一页 41 42 43 44 45 46 下一页 尾页
|