被转了两个帖子过来,引来吐槽无数。其实挺好,我吸收了很多建议,也有同学开始帮助修改一些代码,提交补丁。
那就正式介绍一下 fibjs 吧。
fibjs 是在 2012 年 2 月开始启动的项目,其目的是建立孢子社区的基础开发框架。不使用 nodejs 的原因相信通过之前的沟通,大家都了解了,可能大家不能同意这一点,但是我坚持认为异步不是一个适合大规模部署的开发模式。做做独立的小规模应用尚可。这一点不建议再讨论,我不打算说服任何人,也不打算让任何人说服。
最初的接近两个月时间主要在技术选型,为此考察了 v8,JavaScriptCore 和 SpiderMonkey。SpiderMonkey 本来是个不错的选择,因为其接口声称支持多线程,但是比较遗憾的是在稍后的一个版本注释里面,声明不再支持。JavaScriptCore 也被否决,同样因为无法实现预期目标。
最终选择了 v8 作为基础核心。原因是: 一、支持多线程重入,协程的堆栈本质是线程,所以要支持协程必须要支持多堆栈重入; 二、不支持多线程并发,虽然 isolate 支持多堆栈现场,但是 isolate 内部却为无锁环境,因此不能接受多线程同时运行,必须在一个线程退出后,另一线程才可进入;
以上两个条件是完美的协程运行环境,协程本身便是多现场单线程。每个协程自行建立堆栈,维护程序运行现场,而所有协程同一时间只会有一个激活,大家共用了同一个线程。
在简单封装 v8 后,下一步工作便是协程架构选型。在阅读完可以找到的所有协程实现后,选择了一个基础库(后来废弃,因为其项目本身也已久未维护,现协程核心全部自行实现)。在基础协程库之上,又实现了一整套协程调度,协程与工作线程的通讯基础,基于协程的基础锁对象等,形成完备的协程运行环境。
接下来,便是要将 v8 和协程结合在一起。为此改写了 v8 底部的 platform 层,建立了一个基于协程运行环境的 platform 层,因此 v8 完全感知不到协程的存在,而是认为自己运行在一个多线程的操作系统内部。这也是 fibjs 与 node 各种同步语法糖的最大差异。
其他模块的实现便没什么悬念了,像 http 这样的重头模块也都是写过十几遍的。其他的模块也都只是对已有模块的封装,毫无技术含量。
最初的 fibjs 为了标榜全能,还是支持回调的,程序员可以自由选择使用异步模式还是同步模式开发,而经过几个月的实践,发现根本没有人愿意使用异步,便索性彻底删除了异步接口。
这样经过半年左右的开发,fibjs 已经具备可以实验性上线的条件,团队便开始将孢子社区的代码向 fibjs 迁移(之前的代码是基于我以前写的另一个服务器框架),最终 9 月开始实验性上线。
2013 年初,我开始向外部发布 fibjs 的项目信息,很多朋友开始询问是否开源,何时开源。但是因为 fibjs 运行时间较短,再加上孢子社区开发比较紧张,开源计划一拖再拖。到今年 5 月,终于因为机缘巧合,痛下决心,彻底开源了。
在接下来的几年里,fibjs 会跟随孢子社区的发展持续开发,孢子社区开源 fibjs 有几个目的: 一、回馈开源社区。fibjs 是建立在开源项目基础上的,开发过程中或多或少也算趟了不少的坑,分享出来,或许可以让更多人受益; 二、开源更大的好处是使用场景的多样性可以帮助发现并修复以前隐藏的错误或者不合理的设计,这种回馈会反过来帮助孢子社区的项目; 三、招募新员工,我们持续招募各种大牛,中牛,小牛,小小牛,并通过 fibjs 让你们花更少的时间赚更多的钱;
招聘启事见孢子社区网页源码
fibjs@github https://github.com/xicilion/fibjs fibjs@baoz http://baoz.me/fibjs
最后再强调一下,我不打算说服任何人使用 fibjs,也不打算向任何人证明 fibjs 比 nodejs 谁好谁坏。做 fibjs 的原因是自己要用。如果碰巧有人觉得这货还可用,能解决一些问题,那就欢迎一起来把她搞得更好一些。如是。