天天看点

从一到无穷大 #1 隔离变化,机制与策略分离

区分机制和策略是Unix设计背后隐含的最好思想之一。

任何一个学过操作系统的学生都应该听过这段文字。多么美妙的思想啊,但是真正理解其思维精髓需要大量的工程实践和辅以横向对比,从某种角度讲我认为这种能力是抽象能力以及丰富想象力的聚合,谓之为技术人员的九阳神功也不为过。

Libco[1]是一个在2016年由腾讯开源的一个有栈非对称,1:N模型的协程库,其主体思路是对已知的阻塞操作,条件变量,yield(pool)执行hook替换,实际把所有的套接字设置为非阻塞,并加入全局队列,在套接字可读/可写时执行调度,这其实已经是一个较为完整,且trick的项目,至少在我三年前来看。

让我们再来看看boost.fiber[2]这个优美的家伙吧,fiber并没有提供像Libco那样开箱即用的协程能力,而是抽象出了一个较低层级的体系,比如可自主实现的携程调度接口;锁,条件变量,barrier,join/detach,channel等原语;可自由扩展1:M->N:M等等。但是我们可以很轻松的让Fiber所在线程陷入阻塞,因为系统调用接口的管理完全交给了用户。让我们再来回味Fiber强大的抽象模型吧,只实现标准原语与接口,具体的逻辑交给用户,分离可变部分和不可变部分,至少在写RocketCo[3]时我没想到这些。helio[4]是一个基于boost.fiber开发的现代网络框架(被用作dragonfly[5]的网络框架),其中对于fiber的使用十分的老辣,当然也可以看出机制与策略分离的好处。

在相对熟悉的领域举一些成功的例子,混沌工程学科,Taskflow,SysAK,多模型数据库的统一底座。

再举例子一些失败的例子,Spring框架之于阿里巴巴,我司的不少基架产品。

站在公司的角度而言,产品层面上的隔离变化显然是省钱,磨练竞争力,品牌影响力的好事;

  1. ​​https://github.com/Tencent/libco​​
  2. ​​https://www.boost.org/doc/libs/1_80_0/libs/fiber/doc/html/index.html​​
  3. ​​https://github.com/Super-long/RocketCo​​
  4. ​​https://github.com/romange/helio​​
  5. ​​https://github.com/dragonflydb/dragonfly​​
  6. 夜天之书#4 https://mp.weixin.qq.com/s/l2KYPl9hkviEE8jRTIVs5g

继续阅读