MS:我们在Kubernetes应用程序上使用编程语言Rust over Go for WebAssembly

2020-05-02 17:48:38

微软详细介绍了它的工程师们正在使用Mozilla创建的Rust编程语言的另一个领域,这是Azure团队的一个新项目,用于在Kubernetes中测试WebAssembly模块。

微软已经在试验使用Rust来重写Windows的底层组件,这些组件最初是用C和C++编写的,同时也在寻找Rust的内存安全特性,为维罗纳项目(Project Verona)下的安全基础设施编程创建一种新的语言。

DeisLabs是Azure用于创建Kubernetes工具的孵化器,它还使用Rust构建了Krustlet,让开发人员可以在Kubernetes中运行多个WebAssembly模块(Wasm),Kubernetes是管理Docker容器的主要开源工具。

虽然有很多关于使用Rust进行系统级编程的故事,但是您并不经常听到关于云软件或Kubernetes软件是用Rust编写的故事。所以,我们想解释为什么我们做出了这样的选择,Azure DeisLabs的高级软件工程师泰勒·托马斯写道。

本月早些时候出现的Krustlet项目是高度实验性的,DeisLabs警告说,你应该在生产中使用它,风险自负。

WebAssembly是所有主流浏览器都支持的开放标准,主要用于创建在浏览器中运行的功能强大的Web应用程序。DeisLabs选择Rust for Krustlet的主要原因是,Rust对已编译的Wasm二进制文件或模块具有本机构建支持。

但微软正在推进基于Rust的Krustlet,以帮助开发人员将WebAssembly代码推到浏览器之外,以支持Mozilla去年发布的WebAssembly系统接口(WASI),这样编译器就可以针对单个界面,而不是多个操作系统。

开发人员可以使用Krustlet在Kubernetes中测试WebAssembly模块,同时测试容器通常受到挑战的受限和安全环境中的容器。

DeisLabs开发人员选择Rust也是因为它强大的安全保障。尽管早期的Rust问题拖累了生产力,但他们意识到,通过不暴露空指针、线程安全问题和其他错误,可以节省下游的时间。他们争辩说,与Go相比,他们能够显著缩小Rust编程与Go编程之间的效率差距。

在最初的一周左右,我们浪费了很多时间来学习借贷是如何运作的。大约两周后,与我们在围棋中写作相比,我们的效率恢复到了50%。托马斯写道,一个月后,我们都感到很舒服,恢复到了最高效率(就我们可以编写的代码量而言)。

然而,我们注意到,我们获得了生产力,因为我们不需要花费那么多时间手动检查特定条件(如空指针),也不需要调试那么多问题。

关于Rust中的安全与缺失功能的问题,Thomas强调了最近在Helm中发现的一个竞争条件,它是用围棋编写的,围棋的比赛检查器没有发现它。但是,他说,这个错误肯定会被铁锈编译器捕捉到。

托马斯说,尽管我们有时会怀念垃圾收集器,这样我们就不必担心克隆、借用、所有权等问题,但由于铁锈编译器的严格规则,我们所避免的痛苦是无法估量的。

作为对比,上周,在我们维护的另一个与Kubernetes相关的项目中,我们发现了一个重要的比赛状况。该项目名为“头盔”(用围棋编写),已经在那里存在了一年或更长时间,并通过了围棋的比赛检查器。这个错误永远不会逃脱铁锈编译器的惩罚,从一开始就阻止了这个错误的存在。";

Azure上游应用平台的首席项目经理拉尔夫·斯奎莱斯(Ralph Squillace)说:与围棋相比,使用Rust构建Kubernetes组件是一种美妙的体验,应该在Kubernetes的工作中得到更广泛的采用。

但托马斯说,拉斯特仍然存在明显的问题,包括学习它所需的时间长度。

托马斯指出,需要指出的最重要的问题之一是异步运行时仍然有点不清楚。他还表示,学习曲线是困难的,这与Rustlang最近对开发人员进行的调查中揭示的采用Rust的主要障碍相一致。

在学习曲线趋于平坦之前,需要花费数周的艰苦努力来学习如何在Rust中正确编码。然而,托马斯说,由于前面提到的安全功能,前期的艰苦努力得到了回报。

我们还注意到,一旦开发人员越过了最初的曲线,他们就能够像使用任何其他语言一样轻松地为代码做贡献。只要意识到最初会有一些痛苦就行了。

尽管如此,微软的Azure工程师打算继续将Rust用于其