2 个版本
0.1.1 | 2024 年 2 月 7 日 |
---|---|
0.1.0 | 2024 年 1 月 30 日 |
#564 in 构建工具
19KB
279 行
protobuf-zmq-rust-generator
该包与 prost
合作,开发了一个 ZeroMQ + Protobuf 实现的服务生成器,通过套接字在进程之间实现高效的数据传输。它支持 pub-sub 和 request-reply 模式。
最初设计用于在 NodeJS 客户端和 Rust 服务器之间简化通信,该包可以适应任何遵循此协议的语言。
使用方法
- 将此包作为
build-dependency
安装到您的Cargo.toml
文件中。 - 在项目根目录中创建一个
build.rs
文件。请参阅 prost-build 文档 获取详细说明。 - 在构建过程中使用我们的服务生成器
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/"])
- 生成器将在
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