本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。
区分机制和策略是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框架之于阿里巴巴,我司的不少基架产品。
站在公司的角度而言,产品层面上的隔离变化显然是省钱,磨练竞争力,品牌影响力的好事;
当然这种思维的缺失也导致不少依赖开源社区的下游公司苦不堪言[6]。
引用:
- https://github.com/Tencent/libco
- https://www.boost.org/doc/libs/1_80_0/libs/fiber/doc/html/index.html
- https://github.com/Super-long/RocketCo
- https://github.com/romange/helio
- https://github.com/dragonflydb/dragonfly
- 夜天之书#4 https://mp.weixin.qq.com/s/l2KYPl9hkviEE8jRTIVs5g