在Python和Go项目之后使用Rust的经验分享 - scaleway


我于 2021 年 1 月加入 Scaleway,建立新的网络系统和自动化团队,负责所有工具和基础设施,以帮助网络工程师团队。在这一点上,我主要使用 Python 和 Go 进行编码,我正在寻找一个有用的、非关键的项目来开始试验 Rust 并评估它是否对我们的内部堆栈开发感兴趣。
Scaleway 在我们的日常工作中使用了许多不同的内部系统,并维护所有系统的正常工作。
我们长期使用的其中之一是著名的Netbox,作为我们的 DCIM/IPAM,用于管理我们所有的硬件库存和 IP 寻址计划。我们最近部署了另一个鲜为人知的开源产品Netshot,以满足我们的网络配置合规性和备份需求,同时也替换了我们旧的 RANCID,它只做配置备份并且更难维护。
由于 Netbox 是我们库存的真实来源,而且我们有大量的网络设备(交换机、路由器等)需要管理,因此在 Netshot 上手动添加所有现有和新设备是不可能的每次我们在 Netbox 中添加一些东西时。
我们搜索了可以将设备从 Netbox 同步到 Netshot 的现有工具,但找不到任何东西。
我在 Python 和 Go 方面有很多经验,但我想在一个新的非关键项目中试验 Rust,对于这个项目是一个很好的候选。
 
Rust vs. Python vs. Go
我希望与 Rust 合作,因为它似乎是一种专注于安全性和良好性能的语言。
我喜欢使用静态类型安全,IDE 可以用几种语言帮助解决这个问题。但是由于 Python 的 IDE 在类型安全、重构和完成功能方面并不总是最佳的(它提供了一种带有类型提示的静态类型 - 但它没有被强制执行,并不总是可用,因为 Python 是动态的,并不总是可预测的,它不提供最终任何真正的安全)。所以,我选择了 Rust。
我还在寻找一种可以在单个无运行时二进制文件中编译或打包的语言,这样我们就不必管理任何 Python 或库版本要求。
我喜欢泛型、可选类型、模式匹配和适当的错误管理等高级功能,所以 Rust 似乎比 Go 更合适。

  • 如果该项目在 Python 上运行:必须在我们想要部署它的任何地方管理依赖项的麻烦,或者必须为它创建大量的容器映像 - 部署速度较慢且难以维护。
  • 如果该项目在 Go 上运行,但错误管理不会那么有效:Go 中缺少泛型有时也会让你做一些肮脏的变通方法,而 Rust 会给你一些有趣的功能方法(模式匹配、强大的集合)库包)。

总结:这个项目在 Python 或 Go 中的工作方式相同,但在 Rust 中编码更有效!
 
体验报告
对于使用新语言的第一个项目来说,这种体验很好。编译失败时的错误信息非常明确,通常直接包含问题的解决方案。这些库通常有很好的文档,比如reqwestserdestructopt在我的例子中,这使得它们易于使用,并且与您从 Python 等动态语言中可以获得的相比,各种 IDE 帮助的自动完成功能(类型提示不是精确到真正的静态类型)
当您来自其他语言时,将测试作为子模块直接包含在每个 Rust 文件中的事实有点令人惊讶。但它易于管理,并且来自cargo的集成测试系统是用户友好的。
我在内存管理方面遇到了一些麻烦,因为当您习惯于使用垃圾收集器(如 Python 或 Go)使用语言进行编码时,您已经习惯了编译器给出一些提示但并不总是指向问题的根源。因为这对我来说不是一个持续存在的问题,所以我不时使用 .clone() 以避免过多地增加复杂性。
我还喜欢这样一个事实,即有 Cargo 插件可以直接创建 deb 和 rpm 档案,以便在各种 Linux 发行版上轻松分发应用程序。
这是一次很好的体验,我喜欢使用 Rust,我将在下一个项目中再次使用它。可能有些代码直接在 Cisco Nexus 设备上运行,以避免使用旧的 Python 2。Rust 将成为团队中的默认语言之一,因为我们一直对其功能感到满意。
由于不必手动添加所有新设备,开发此工具为我们节省了大量时间和麻烦。该项目可在此处获得,旁边还有 Scaleway 参与的其他开源项目。