Dropbox开源PB-Jelly,一个面向Rust的协议代码生成框架

2020-09-17 00:50:32

这个实现最初是在2016年编写的,目的是满足在Dropbox的存储系统(Magic Pocket)中洗牌大量字节的需要。以前,我们使用的是rust-protocol buf(因此生成的API与rust-protocol buf完全相同,以便于迁移),但是将rust结构序列化为原始消息,然后将它们再次序列化到我们的RPC层,这意味着多个副本(在解析堆栈上也是如此)。控制实现并将其端到端集成到我们的RPC堆栈中有助于避免这些额外的副本。

多年来,这个实现已经发展成熟,目前已经在Dropbox的几个部分中使用,包括我们的同步引擎和前面提到的Magic Pocket。

在Rust生态系统中还有其他实现(例如Prost和Rust-Protobuf),我们也想分享我们的实现。

有只有两个板条箱,您将需要的,如果您想使用这个与您的项目PB-JELLY和PB-JELLY-GEN。

包含为我们生成的代码提供动力的所有重要特征和结构,例如Message和Lazy。将其作为依赖项包括在内,例如。

为Proto2和Proto3文件生成Rust结构和实现的框架。将其作为构建依赖项包括在内,例如。

Protoc-Protobuf编译器,它可以从源Protobuf构建,也可以通过BREW安装Protobuf安装。

Python2-与proc一起使用的codegen插件是用python2编写的。在运行它之前,您将需要安装一些软件包,一个requirements.txt正在等待#18。

看一下示例箱子,看看我们是如何利用pb-jelly-gen和build.rs开始在Rust中使用协议的!

PB-test包含集成测试和基准测试。您不需要担心这个问题,除非您想为这个存储库做贡献!

我们提到可伸缩性作为一项功能,这是什么意思?我们坚持认为每个模块都应该是一个板条箱,而不是用原型文件生成1:1的Rust文件。我们采取这种立场是因为锈菌在板条箱之间是平行的,但在板条箱内还不是完全平行的。当我们将所有生成的Rust代码放在一个箱子中时,编译时间最长的往往是这个箱子。要解决编译时间过长的问题,需要创建许多板条箱!

第一,我们非常赞赏和高度鼓励大家的贡献。出于法律原因,所有外部贡献者必须同意Dropbox的CLA。谢谢您的理解。

这里的一些功能需要额外的工具才能发挥作用,而这些工具还没有公开。

Spec.toml是一个精简的模板化Cargo.toml-您可以通过脚本将其转换为Cargo.toml,以便在多机箱项目中获得一致的依赖项版本。目前,用于转换Spec.toml->;Cargo.toml的脚本尚未提供。

向原型文件添加字段将导致编译器错误。这可能是一个好处,因为它允许编译器识别可能需要访问的所有调用点。但是,它可能会使更新具有多个调用点的Protos变得有点单调乏味。我们选择了这条路线,以便在编译器的帮助下更容易地添加新字段和更新所有调用点。

安装依赖项/测试依赖项。这些说明适用于使用BREwPackage管理器的OSX。使用适合您系统的包管理器。

Rust-Protobuf-Rust实现Google协议缓冲区Prost-Prost!Rust语言QUICK-PROTOBUF的协议缓冲区实现--PROTUBUF解析器serde-Protobuf的Rust实现