Skip to content

RPC Transport

RPC 传输层位于 include/raftpp/raftor/rpc/,负责节点间消息发送、连接维护和编解码。

Transport 提供以下核心接口:

  • Start()
  • Stop()
  • AddPeer(id, addr)
  • RemovePeer(id)
  • Send(messages)
  • SetMessageCallback(cb)
  • SetErrorCallback(cb)
  • Poll(timeout)
  • Run()

transport.h 明确规定:

  • MessageCallback
  • ErrorCallback

都只会在调用 Transport::Poll()Transport::Run() 的线程上触发。

因此,回调逻辑应视为运行在传输事件循环线程上。

Send(nonstd::span<const Message>) 根据消息的 to 字段路由。

对于未知 peer,接口定义明确说明:消息会被静默丢弃。

Codec 用于普通消息帧,格式为:

  • 4 字节 magic:RAPF
  • 4 字节 header length
  • Cap’n Proto RpcHeader
  • Cap’n Proto payload

关键常量:

  • kMagic = 0x52415046
  • kVersion = 1
  • kDefaultMaxMessageSize = 64MB

握手帧使用独立编码器,magic 为 RAPH,用于连接建立阶段的协商。

PeerManager 维护 peer 的连接状态和重连节奏。每个 peer 记录以下信息:

  • id
  • addr
  • state
  • last_activity
  • failure_count
  • reconnect_after

连接状态包含:

  • Disconnected
  • Connecting
  • Connected

当连接失败时,PeerManager 会记录失败次数,并基于指数退避安排下一次重连时间。

TransportConfig 的主要字段包括:

  • listen_addr
  • node_id
  • max_message_size
  • connect_timeout
  • reconnect_interval
  • 回调线程与调用 Poll() / Run() 的线程一致。
  • 未知 peer 的消息会被丢弃。
  • callback 必须在 Start() 前设置,且不能与 Poll() / Run() 并发修改。