Zino开发框架作为『框架的框架』,在最新发布的0.8版本中实现了与actix-web框架的集成。至此,Zino同时支持了Rust社区中最流行的两个Web框架:axum和actix-web。
在2022年7月的Web框架性能测试中,actix-web排名第5(据说曾经排名第一,但具体年代已经有点不可考查了):
上图中排名前10的Web框架,Rust占了5个(may-minihttp、xitca-web、actix、salvo、axum),Java占了2个(officefloor、wizzardo-http),JavaScript、C++、C#各占1个(just、drogon、asp.net core)。实际上just是基于V8的,其实也应该算成C++语言的。再结合功能的完整性和流行度考虑,前5名中真正可用的Web框架也就是drogon和actix。在上图的测试中,axum和actix相比,性能略低了10%左右。但是在Zino框架的测试中,我们发现实际情况好像并不是这样:
第一个图是基于actix-web的测试,第二个是基于axum的(都是10000个并发跑120秒),前者的每秒处理请求数比后者要低5%-15%(当然也有可能是在误差范围内,或者Zino框架与actix-web集成的优化还没有做好),但是在时间延迟和错误率上,actix-web确实比axum要好得多。在真实的业务场景中,高并发下的延迟和错误率往往比请求数更有价值。当然,这并不是说我们开发项目就要优先使用actix-web,实际需要考量的因素还有更多。相比于axum,actix-web的API更不友好,你看看actix-web中的这个泛型约束:
能看得懂吗?反正我是没看懂(这种复杂性一部分来自于基于Box的async-trait的缺陷,或许等Rust 1.74中提供了原生的async-fn-in-trait功能特性之后可以简化)。当然,看不懂也不影响我们写应用。Zino框架通过应用接口抽象,可以允许你在actix-web与axum中自由切换并且尽可能少地改动代码。在前面测试的应用示例actix-app和axum-app中,只有router和middleware两个模块需要改动,所有其它的模块(controller、service、schedule等)都不需要任何改动,包括main.rs也完全相同:
简洁的接口背后有大量的工作!实际上,actix-app和axum-app中的Cluster是不一样的,只是使用条件编译使得它们的命名相同:
对于使用者来讲,并不需要关心这种接口的差异,只需要专注于把业务代码写好。我们的Zino开发框架帮你彻底摆脱到底是用actix-web还是axum的艰难抉择!