前两天围观国内Rust的视频会议,有人说Rust不适合做Web开发,真的是这样吗? 肯定不是,一门注重安全的语言应该最适合用于Web应用程序的开发。因为Web要的就是稳定,服务器能7x24长期运行不宕机,对开发语言是个挑战。Rust已经被业界证明目前是最安全的语言,编译器能帮我们在发布前将大部分的Bug找出来,做出的产品应该是最稳定的。Rust做Web开发的难点在于选择什么组件。
做Web开发,Java有Spring, Go有Gin, Nodejs有Koa, Rust应该用什么组件呢?
目前最热的是Rocket与Actix-Web, 这两个我都不看好。Rocket发行版基于老的hyper 0.10,不支持Async/await,异步版本正在开发中, 不推荐。 Actix-Web为了性能引入了许多unsafe代码,带来许多Undefined Behavior, 稳定性堪忧,实际测试中发现https并发只能做到2000,上2500就崩了。国人写的Roa借用了Koa的概念,基于异步的Hyper0.13,完全Aysnc/await,测试中发现Async-std用的很重,而其底层hyper 0.13是基于Tokio 0.2的,两种异步运行时混用,稳定性还需要用时间来检验,作者也提供了Tokio运行时的案例,编译未通过。
最后,本文的主角出场,她就是Warp, 基于Filter路由的Web组件。Warp用例在ApacheBench压力测试中性能完全不输Actix-web, 而且在https 万次并发中没有发现任何问题。应该是目前Rust生态中web开发最稳定最高效的组件。推荐warp的原因还在于warp的作者Sean McArthur,就是hyper的作者,hyper是目前很多web组件的底层。此外,用于web客户端调用的reqwest与用于构架微服务/RPC的tower也出自Sean McArthur。该大牛的个人主页地址https://seanmonstar.com/
评论区
写评论我现在也改用warp了, 我发现actix-web会内存泄漏, 不知道哪里泄漏, roa里面部分还用了actix的东西, 实测也泄漏了. 我晕, 最后还是warp香, 就是组合子的写法太诡异了, 编译报错超大超大一坨.
rust是很棒,但是像go有net/http包,dotnet里面有aspnet这样的项目,背后都是谷歌微软几千人在拿工资,十几年如一日的维护,相比rust,靠各个社区志愿者贡献代码,如果mozilla官方能牵头完善下周边生态就好了
贴一个用Warp+tiberius连接SQL Server的压力测试结果,万次并发,百万总连接,跑了50分钟,稳稳的。 Thinkoad T460p 笔记本电脑,i7-6820HQ, Win10 系统
这是测试源代码: cargo.toml
main.rs
sqldata.rs
最近一直在学着用,把一个web项目,我从go重构到java,再到现在重构到rust,深深感知到rust是真的不好入门,为什么不好入门,就是因为反直觉重逻辑,逼着你看源码自己找自己的问题,这些都是自己的问题,原来都是直接找别人的博客直接复制粘贴,没有思考,用就完事了,所以我感觉,虽然有点难,想一想为什么难,也就可以理解了。
目前,至少我还再等大佬们辛苦耕耘... 期待rust web的最佳实践,配套的脚手架,以及生态。
再发表点不成熟的见解
语言复杂难学问题不大,rust入门是我接触过语言里最难入门的,也许是我菜吧,,从入门到入门
但是供开发者使用的应用框架应该封装的足够简单,傻瓜式的
开发者也是框架的用户,只有应用框架足够的易用,简洁,用户心智成本低才愿意使用
简单到项目忙的时候,拉一个有点儿开发常识的实习生过来,巴拉巴拉告诉他在哪个文件加接口,哪个文件写实现,他Ctrl+C / Ctrl+V 也能粘的飞起的的时候,Rust web 的春天就来了~
真正的傻瓜,无脑,才能容易流行起来
前一阵儿把组里的Spring boot项目下载下来,组长给我叨咕叨咕没用过java也能复制粘贴开始写接口了
Controller加个接口,service 和 serviceImpl 文件里写声明与实现,Mapper的XML里写写SQL
一个CRUD接口就成了,虽然很不喜欢java项目,一坨坨的代码啰嗦的很
不过不得不承认,多人协作开发,代码写在约定的框架里,最后都差不多
要是换成python,拿flask硬撸,一个人一个风格,express同理
还有就是web也是需要生态的
今天数据库用的PostgreSQL,明天项目要切MySQL,后天要加个kafka缓冲下数据
随时调整,也应该足够简单,目前来看,Rust web 任重道远
只有性能和安全还是远远不够的
我感觉还需要再等等
等一个功能更丰富的集成框架出现,结构/规范/插件都有最佳实践那种
像Node里的Express,几行代码就跑起来了,但是自己要写很多功能,东拼西凑的
而现在要是开新坑,也是更喜欢Nestjs这种,有一定的封装,约定俗成等等。
现在的Rust Web,主流的还是像Express这种偏向功能单一的Web框架,就等这些前辈框架们再踩踩坑
然后最终的革命者出现
然后不合适还是因为门槛高,crud 大部分情况下不需要这么稳定,不需要这么高性能。。。
actix 的第一个 async beta 版本我线上跑了一年多了。。稳如狗
我觉得 warp 是最有特点的, 而且用起来感觉比其他框架舒服
actix的性能一直是TechEmpower的前几位,给rust张了不少脸,生态也比较完善,应该不至于不稳定。
ps:actix的原作者宣布退出了。 https://github.com/fafhrd91/actix-web-postmortem
roa默认hyper的runtime features是关闭的,没有使用tokio,上面的“两种异步运行时混用”并不正确
这个framework可以用async-std做运行时吗?
actix-web 真的不稳定么...
加上web前端的wasm,看好rust
棒!实力笑到最后。