日前,CSDN 采访了 Rust 方面资深利用 者庄晓立和Elton,很多 人对于Rust在应用方面有着极大的爱好 ,为此我们创建 了 CSDN Rust 学习交换 群(见文末的二维码),约请 Rust 中文社区站长、妈咪问问 CEO 唐刚为我们分享妈咪问问的Rust实践。
唐刚(GitHub),Rust 中文社区站长 、妈咪问问 CEO ,前美洽网络连合 首创 人兼 CTO,曾在龙芯梦兰担当 近 3 年的研发工程师 。
毕业 于电子科技大学,前期侧重 于嵌入式开辟 、Linux 驱动开辟 、Linux 发行版定制等技能 范畴 ,如今 对 Rust 非常感爱好 。从2010年开始投入到Web开辟 和互联网创业中,主导开辟 了 MVC Web框架 Bamboo(lua语言)并应用在了一些项目中。
以下为分享实录:
妈咪问问是一个集成化的本地 母婴在线及时 咨询平台,提供就近服务机构的医疗 、康健 、生理 等免费咨询 。相对于别的 母婴类产物 ,它的特点是简单 直接地办理 题目 (IM情势 ),后端是大量本地 的服务机构专家的服务。
如今 妈咪问问刚上线,各方资源都还在连续 入驻中。此中 ,妈咪问问有一个自助呆板 人,叫智能保姆明白 ,假如 以为 无聊,可以任意 调戏它 ,在微信内里 访问 这个链接进入这个智能咨询室 。
妈咪问问产物 组件
「妈咪问问」如今 提供 iOS App、Android App 、微信谈天 室、微信公众账号接口4个前端,对于服务机构,尚有 一个专门的PC工作台客户端。以是 说她是一个咨询集成化平台 ,固然 ,要做到这一步,尚有 很长的路要走 ,但是,我还是 信托 Rust ,由于 他做的背景 黑白 常稳固 的。
妈咪问问如今 只有部分 利用 了Rust ,重要 用来写业务逻辑,重要 包罗 用户的注册登录、页面的渲染 、url哀求 处理 惩罚 、微信接口与IM接口的买通 、各服务数据同步服务等等 。像数据处理 惩罚 组件和IM组件都是用的成熟的第三方的服务(感谢亲加语音云通讯的大力 大举 支持,SVIP级别的用户了)。
我和Rust的故事我第一次闻声 Rust大概是在13年年初 ,由于 我不停 都是火狐粉,比力 认同Mozilla的精力 (分享知识 共建开放网络),以是 当时 发现他们在做这个项目就瞟了一点,发现这个语言很丢脸 懂 ,完全不知所云,之后就不再关注了。而且在谁人 时间段,我正沉醉 在动态语言的便捷性内里 ,以为 动态语言已然很强大 了(fall in love with Luajit),没有须要 把握 一门静态语言了 。
第二次开始关注是在14年9月尾 ,这之前踩了很多 动态语言的坑 ,不停 在思考 有没有从很底层办理 工程质量的工具或语言?于是观察 了各种非主流(这里的意思是相对于C 、C++、Java来说非主流)语言 Erlang、Go、Haskell等,不外 感觉都不是太合胃口。然后就想起来Rust,于是转头 细致 阅读了官网上的文档 ,当时 是 0.11 stable。发现这个语言跟13年的时间 ,感觉是两个语言了,没有任何认识 的感觉 ,就开始试着学习。当看到ownership, move, copy, borrow, borrow mut 这些概念的时间 ,一下子就震动 、震动 、震动 了 。这是我之前所谓学习过的数十种语言中完全未曾 分辨的概念! 以是 我有种预感,Rust有戏!
各人 都能感受到的吧,编程语言的计划 都透暴露 一种哲学 ,在哲学上,假如 把一个概念辨析得越清楚 ,那么它分析题目 就越犀利。这就是我的开端 感受。厥后 就开始认真学习 ,参加 各种社区的讨论,先是在Google Group上发现了liigo建的群,当时 群里只有2,30人 。厥后 ,我们早期几个人又一起建了个论坛 https://rust.cc,好让rust在中国有个根据地。提及 来这个Rust的服务器是由SpeedyCloud免费提供的,放在香港 ,感谢他们对开源社区的支持。
被动态语言宠坏的人,着实 都比力 懒,对很多 细节的概念也比力 含糊 。以是 ,我学起来也还是 比力 吃力的,跟大部分 人一样。
此中 有一些比力 蛋疼的事变 ,Rust在1.0发布之前,特性变革 得很快 ,一样平常 来说,上一周的代码拿这周的Rust编译器是编译不外 的。然后,例子也不多 ,网络上绝大部分 别的 的文档都过期 了的,不能看 。这种环境 不停 连续 到15年的4、5月份。5月15日,Rust 1.0 发布了 ,官方会包管 兼容性。然后我们就开始用了,于是,我预备 先把之前我写的bamboo web开辟 框架翻译成 Rust ,取名叫bamboors,但是翻得根本 能跑起来后,忽然 发现 ,nickel.rs 已经实现了我想要的绝大部分 功能了,而且很多 方面,比bamboo想得还殷勤 。那何不就基于nickel.rs来做呢,以及为nickel.rs社区做贡献呢 ,于是就开始了利用 nickel.rs写妈咪问问背景 的征程,下面是我在这个工程中用到的一些依靠 库:
[dependencies]
hyper = "~0.5"
postgres = "*"
rustc-serialize = "*"
mime = "=0.0.11"
redis = "*"
chrono = "*"
log = "*"
fern = "*"
nanomsg = "*"
rand = "*"
rust-crypto = "*"
#image = "*"
toml = "*"
lazy_static = "*"
jsonway = "*"
json_macros = "*"
为什么要用Rust,以及其他语言的对比 要具体 提及 来 ,我以为 大概 有几点:
我被Rust震动 了,以为 它将来 必火,而我在技能 上的直觉自以为 还蛮准的;Rust运行速率 快;Rust代码写起来真的是很严谨 ,很清楚 ;Rust工程开辟 服从 不低(出乎很多 人的料想 )!
在利用 体验方面,一样平常 来讲,利用 Rust计划 一个模块前 ,要前前后后把模块的前端后端 、数据库怎么计划 、交互这些都想清楚 ,一步一步写下来。然后,就开始用Rust实现 ,一样平常 我用Rust写完代码后,编译会出现很多 题目 。这时Rust编译器的提示 很清楚 ,一眼就知道那边 遗漏了,那边 写法不对 ,那边 范例 不匹配。然后,修改等编译通过后 ,跑起来 ,就可以测试业务精确 性了 。
Rust号称,只要你能编译通过程序就不会瓦解 的,我没有正确 统计过 ,不外 我感觉我的一次精确 率在95%,这个指业务逻辑的精确 率,我以为 这就是Rust的威力!而我之前用动态语言的时间 ,一次乐成 率不高出 7~80%,由于 动态语言答应 你放肆……人嘛,偶然 都喜好 偷懒 ,偶然 求快,题目 没有完全想清楚 就开始动手了,结果 开辟 服从 反而低了。
总体而言,我感觉 Rust 写业务代码的服从 和Node.js写业务代码和服从 差不多。Rust写的代码多一点 ,写得慢一点,会耗费 编译时间,但是相对于Node.js ,假如 加上调试时间的话,就差不多了 。假如 再加上题目 没想清楚 就动工的话,Rust可以胜出。由于 假如 你题目 没想清楚 ,你写的Rust代码一样平常 来说都是编译不下去的,会逼迫 你想清楚 !然后,用Rust写的代码 ,测试用例不消 很多 ,这个相对于动态语言也可以省大把开辟 时间和大把维护时间。
而作为创业项目,一样平常 都是要求尽快撸出业务 ,尽快上线,上线后再迭代,因此一样平常 都会选择动态语言来开辟 。但是我以为 ,这并不是说不要把题目 想清楚 ,就可以由于 寻求 快上线就可以放弃稳固 性。
我用Rust开辟 的过程中,也碰到 很大的进度压力,这时怎么办?我代码内里 如今 还存在大量的unwrap() ,这个着实 是有风险的,也就是说我没有做细致 的错误处理 惩罚 。这个时间 ,比如 一个参数或一个状态不精确 ,就大概 导致服务器(线程)瓦解 ——对的,是线程瓦解 ,不是整个服务器瓦解 。我也犯了先撸业务的弊端 ,但是Rust能资助 我明白 题目 ,减轻痛楚 :
在测试过程中,我发现一旦出了题目 ,我们可以很快地定位题目 代码——由于 这些代码都在unwrap()或别的 未处理 惩罚 的非常 语句那儿,这是一个很紧张 的特性!等进度和缓 一点,或人手充裕了后,就可以来动手 补全这些unwrap()的处理 惩罚 了。由于 Rust根本 能包管 ,除了这些地方,别的 地方的代码,一旦编译通过 ,是不会出题目 的。这就给人一种很踏实的感觉——可猜测 性,这个对于工程和科学来讲,很紧张 。
假如 一个东西举动 不可猜测 ,那我们内心 一天都是提心吊胆的,程序员轻易 猝死,我想是不是也有这方面缘故起因 。
利用 Rust 碰到 的题目 及办理 之道这3个月 ,大概碰到 这么几个题目
nickel.rs(底层是hyper),作为一个Web Server竟然不能袒露 出端口来直接访问,这里的不能不是不可以 ,是不好 。比如 一个4核的呆板 跑hyper线程池,默认是开启10个,但假如 有10个keep-alive毗连 连上来,那么第11个连的就卡住了 ,当时 查这个题目 查了一天,厥后 ,把它架在nignx署理 背面 就好了 ,估计这也是hyper在ab上测试不外 的缘故起因 ;nickel.rs 如今 是基于hyper 0.5的,而如今 hyper 0.6的接口已经变革 了,nickel没有跟进。近来 他们的开辟 有点不太积极了 ,以是 ,我筹划 我们可以构造 起来来维护这个东西;图片处理 惩罚 库的题目 。rust有一个库(crates.io上)叫image,用作图片处理 惩罚 。开始我以为他很强大 ,至少应该跟gd库不差,可它很多 格式的图片都不支持,就连JPG都支持不全 ,厥后 还是 用了 imagemagick 的 convert 来处理 惩罚 。以是 ,这些都是生态不美满 的结果 。
对筹划 学习和利用 Rust 人的发起 起首 ,要有生理 预备 ,担当 一些新的概念。这些核心 的概念是有其代价 地点 的 ,我见过很多 新同砚 ,一上来就说Rust如许 写也不可 ,那样写也不可 ,太不方便了。如许 特性也没有,那样特性也没有,功能太弱了 。这实际 也是在反应他之前的编程的严谨性大概 是有肯定 题目 的 ,就我本身 来说,用了rust一段时间后才发现本身 从前 写多线程程序有太多没有留意 的地方。
与此同时,由于 如今 Rust文档比力 缺乏 ,上手难度相对较高,以是 比力 轻易 卡在编译阶段,这时 ,可以多看官方文档。
借力社区 。论坛、QQ群 、微信群等都有很多 的大牛,不懂的就问,是办理 题目 的最佳之道。社区近来 也在讨论、翻译技能 文档、出书和录制视频教程等事变 ,让Rust的学习更加的轻易 些。
参加 项目 。我们也会构造 一些开源的Rust项目 ,各人 一起来参加 ,大概 学习进步会更快一些,可拜见 :github.com/rustcc 和 https://play.rust-lang.org/(交换 Rust代码的好地方)。
QA环节
John:Mike有没有关于利用 Rust和Node过程中开辟 服从 和运行性能对比?
Mike:对比开辟 服从 ,差不多。运行性能的话,我测试的nickel.rs和node echo 对比,在我呆板 上 ,nickel.rs 是48000,node是 23000。如今 我们体系 处理 惩罚 当前的业务已经够用了,不可 就扩展服务器 。
Andy:Mike你提到过“Rust开辟 测试用例不消 很多 ” ,能表明 下为什么吗?和Ruby/Java分别对比的话,Rust的测试有什么上风 ?
Mike:由于 起首 ,参数范例 不消 测试了 ,这个就省很多 代码。Rust的cargo管理工具内建测试机制三个条理 的,很方便。Java 、Ruby也雷同 吧,但是感觉没Rust这么方便 。别的 ,Rust和cargo还能对文档解释 中的代码举行 测试 ,以是 说,Rust是实用主义派——近15年最佳工程实践的集大成者。
cuterxy:Rust 支持增量编译吗?大工程怎样 管理?
Mike:支持支持增量编译。cargo是一个项目管理工具,如pip ,cargo管理工具大量吸取 了Ruby社区的良好 履历 ,Rust的module机制,也很得当 大工程管理(作者做了bundle ,然后rust组把他约请 过来给rust做) 。
toml格式的设置
相干 阅读:
【微信群活动 报名】Rust实践分享:用Rust打造母婴在线及时 咨询平台
后续 CSDN Rust 学习交换 群会约请 更多的大牛来举行 分享,假如 你想及时 听课和提问,请加群主微信 qshuguang2008 或扫描下方二维码被约请 进群 ,备注:实名+公司名+Rust。
本文为CSDN原创文章,未经答应 不得转载,如需转载请接洽 market#csdn.net(#换成@)