#protobuf #generator #zmq #prost-build #cargo-toml #rust

构建 protobuf-zmq-rust-generator

用于 Rust 的 prost/protobuf 服务生成器,可生成 zmq 服务器

2 个版本

0.1.1 2024 年 2 月 7 日
0.1.0 2024 年 1 月 30 日

#564 in 构建工具

MIT 许可证

19KB
279

protobuf-zmq-rust-generator

该包与 prost 合作,开发了一个 ZeroMQ + Protobuf 实现的服务生成器,通过套接字在进程之间实现高效的数据传输。它支持 pub-sub 和 request-reply 模式。

最初设计用于在 NodeJS 客户端和 Rust 服务器之间简化通信,该包可以适应任何遵循此协议的语言。

使用方法

  1. 将此包作为 build-dependency 安装到您的 Cargo.toml 文件中。
  2. 在项目根目录中创建一个 build.rs 文件。请参阅 prost-build 文档 获取详细说明。
  3. 在构建过程中使用我们的服务生成器
       prost_build::Config::new()
       // Optional: defaults to $OUT, can be changed for autocomplete support
       .out_dir(out_dir)
       .service_generator(Box::new(ZmqServerGenerator {})) // here
       .compile_protos(& ["your_proto_file.proto"], & ["your/proto/location/"])
    
  4. 生成器将在 out_dir 中创建一个 your_proto_file.rs 文件,其中包含生成的代码。

现在来操作服务服务器

  • 导入 [Method]Handler 接口并实现它以响应。
  • 对于数据发布,使用服务器生成的 publish 方法来操作 .proto 文件中的每个 pubsub 方法。

查看我们的测试文件以获取全面示例。

实现细节

在本节中,我们将讨论此包中涉及的设计决策。理解每个细节并非使用此包的必要条件,但了解其局限性可能有所帮助。

要求

  • 目标:在扩展 API 时,通过最小修改实现进程间通信
  • 提供类型安全
  • 支持为订阅特定主题的不同进程创建数据流。
  • 允许轻松地在进程之间创建异步请求/响应任务。

因此,我们有两个操作模式:

1. 发布/订阅模式

  • 发布者应用程序绑定到套接字。任何数量的订阅者应用程序都可以连接。
  • 对于通信,ZMQ帧协议应为:[methodName, Output],以字节为单位
    message EmptyInput {}
    
    message SubscriptionItem {
      string data = 1;
    }
    
    service MyServerService {
      rpc SubscribeToItems(EmptyInput) returns (stream SubscriptionItem) {}
    }
    

传输的数据应为:["SubscribeToItems", SubscriptionItem]

  • 发布/订阅方法应以 "SubscribeTo..." 开头。稍后我们将提供一种使用 protobuf 选项定义此模式的方法。
  • 客户端可以使用 methodName 消息订阅和过滤事件。
  • .proto 文件定义的返回类型应是一个数据流。

2. 请求/回复模式

  • 使用 ROUTER/DEALER 套接字允许异步请求。
  • 服务器应同时处理多个请求。
  • ZMQ帧协议应为:[requestId, BLANK, methodName, Input],以字节为单位。服务器应回复 [clientId, requestId, Output]
    message MyRequestInput {
      int32 time_to_sleep = 1;
    }
    
    message MyRequestResult {
      bool all_ok = 1;
      string message = 2;
    }
    
    service MyServerService {
        rpc MyRequestMethod(MyRequestInput) returns (MyRequestResult) {}
    }
    
    此示例的传输数据应为:[requestId, BLANK, "MyRequestMethod", MyRequestInput]
    • requestId 是客户端随机生成的字符串
    • BLANK 是一个空帧,用于模仿原始协议中的请求/回复模式。
    • clientId 默认由客户端包含。ROUTER 也应在回复中包含此信息,以确保将回复正确地分配给客户端。

可以在同一服务上使用这两种模式:注意:目前,我们只支持使用此包构建服务器实现。未来的更新可能包括客户端实现。

资源

  • protobuf-zmq-ts-transport:允许我们使用此协议进行通信的 NodeJS 实现
  • ZeroMQ:用于在进程之间传输数据的消息库
  • Prost:用于从 protobuf 文件生成 Rust 代码的库

贡献

我们欢迎对此项目的贡献!

依赖项

~7–17MB
~226K SLoC