在最初的阶段,寻求一个后端框架的偏好是尽量多的人使用,且拥有大量的使用人群基础,良好的文档说明,强大的基础生态,基于上述特征,我把目光锁定在了 Spring 上。由于 Java 的语法繁琐,我需要一个富有表现力的语言,kotlin 现代的语言特性实在令人喜欢,我选择了 kotlin。数据库上,鉴于 NoSQL 的大量吞吐特性,选择了 MongoDB。
在经过一段时间的使用,我个人得到了一些使用感受。首先,Spring 的问题是过于笨重了,每次启动在内存里就需要四百多兆,启动也不够快速,稳定性上和可靠性无可挑剔,文档非常全面但也冗余,想找点什么发现并不好找,相关配套的虽然全面,配置和使用成本依然有一些的。Kotlin 语法上特别好,但在其脚手架的搭建相比其他语言来说,略显复杂了,转译的时间开销,我在 wait wait wait。选择 MongoDB,是比较大的失误,在维护性上远没有关系型数据库舒适,MongoDB 需要依赖输入数据时的数据类型保证。
在后续,我把目光锁定在了性能更好更轻量的 vert.x。将一部分代码迁移过去以后,配置在 linux 机器上,短暂尝试 Jar 直接运行却没有成功,没有更多精力探索了,只能通过官网的方法,先 mvn package,再 mvn exec:java,意味着 mvn 也要在目标机器上安装,分发起来麻烦。它的设计思路非常像 express 以及 koa,有极大的灵活性,想增加 OpenAPI 来加强其规范,发现维护成本并不低,且结合使用非常别扭,这个增加的规范牺牲了灵活性,维护规范有更多的成本,比如在 OpenAPI 写完了请求地址、参数,vertx 只能绑定地址,参数是无法自动映射的,这番作业下来非常的傻,不如只要它的灵活性。它的异步方式上,配套使用它的异步框架应该有比较好的效果,但是它的异步库的使用没有其他成熟库的使用方便,交叉使用,异步里套同步,中间的同步过程是否会将性能降低呢?舍近求远了吗?
规范、性能、轻量难道无法兼有?如果只要性能呢?新式语言上尝试 Rust,使用了 rocket 和 actix,rocket 更加规范些,actix 由于其异步设计性能更佳。普遍看来异步的设计能获取更好的性能,但是异步的异步的心智负担,也正如这类语言带来的性能优势却又更高的书写成本一样。在我有限的时间里,可能无法使用 Rust 得到我预期的产出。当前来看 Rust 的生态,还是比较匮乏的。学习探索的话,尽量用更小的目标,和更小的 demo 来作为原理探索吧。