peer结构体是Peer接口的实现,peer是远程raft节点的代表,本地raft节点通过peer给远程raft节点发送消息
每个peer有两个发送消息的基本机制:stream和pipeline
stream是长连接,它始终可以传输消息。除了通常的stream,还有优化的stream用于leader发送msgApp消息,因为msgApp占了大部分的消息
pipeline是一系列客户端发送请求到远程节点,在传输完成后会立即关闭连接,主要负责数据量较大、发送频率较低的消息。如MsgSnap消息等。
peer结构体及字段的含义如下:
type peer struct {
lg *zap.Logger
localID types.ID //当前节点ID
// id of the remote raft peer node
id types.ID //该peer实例对应的节点ID,对端ID
r Raft //Raft接口,在Raft接口实现的底层封装了etcd-raft模块
status *peerStatus //peer的状态
/*
每个节点可能提供了多个URL供其他节点正常访问,当其中一个访问失败时,我们应该可以尝试访问另一个。
urlPicker提供的主要功能就是在这些URL之间进行切换
*/
picker *urlPicker
msgAppV2Writer *streamWriter
writer *streamWriter //负责向Stream消息通道中写消息
pipeline *pipeline //pipeline消息通道
snapSender *snapshotSender // snapshot sender to send v3 snapshot messages 负责发送快照数据
msgAppV2Reader *streamReader
msgAppReader *streamReader //负责从Stream消息通道中读消息
recvc chan raftpb.Message //从Stream消息通道中读取到消息之后,会通过该通道将消息交给Raft接口,然后由它返回给底层etcd-raft模块进行处理
propc chan raftpb.Message //从Stream消息通道中读取到MsgProp类型的消息之后,会通过该通道将MsgApp消息交给Raft接口,然后由它返回给底层的etcd-raft模块进行处理
mu sync.Mutex
paused bool //是否暂停向其他节点发送消息
cancel context.CancelFunc // cancel