帧结构
用于承载 Raft RPC 的带长度前缀的二进制分帧。 与客户端协议以 \n 结尾的帧不同,这里先发送长度,再读取相应字节数的数据。 一条连接上的请求-响应对是顺序往返的,并且发起拨号的一方始终是请求方。
请求(拨号方 → 接收方)
结构refresh
响应(接收方 → 拨号方)
结构refresh
| 字段 | 大小 | 内容 |
|---|---|---|
tag | u8 | RPC 类型 —— 见 RPC 类型(仅请求中有) |
len | u32,大端序 | 后续 payload 的字节长度 |
payload | len 字节 | 以 postcard 格式序列化的 openraft 类型 |
连接管理规则
len上限为 64 MiB(接收时校验)。超出限制的帧、格式错误的帧、未知的tag,或 Raft 处理错误,都会通过关闭连接来处理 —— 拨号方(openraft) 会重新连接并重试。- 拨号方对每个目标节点复用同一条连接。发生 I/O 错误,或往返过程中途被 取消时,该连接会被丢弃,下一次调用会拨打一条新连接 —— 半读状态的流永远 不会被以错位状态复用。
术语
- 长度前缀 (length-prefix) —— 先发送正文长度,再精确读取相应字节数的 分帧方式。无需像
\n这样的分隔符,因此可以原样承载任意二进制数据。 - 序列化 (serialization) —— 把内存中的结构体转换为适合传输的字节序列。
- RPC(远程过程调用) —— 通过网络调用另一台服务器上的函数的请求-响应对, 就像调用本地函数一样。