Etcd中raft协议源码分析

以etcd或者docker中的raft协议为列子,来解析raft协议的实际落地

server通信

概述

server之前的消息传递并不是简单的request-response模型,而是读写分离模型,

即每两个server之间会建立两条链路,对于每一个server来说,一条链路专门用来发送数据,另一条链路专门用来接收数据.

在代码实现中,通过streamWriter发送数据,通过streamReader接收数据。即通过streamReader接收数据接收到数据后会直接响应,在处理完数据后通过streamWriter将响应发送到对端

对于每个server来说,不管是leader、candicate还是follower,都会维持一个peers数组,每个peer对应集群中的一个server,负责处理server之间的一些数据交互。

当server需要向其他server发送数据时,只需要找到其他server对应的peer,然后向peer的streamWriter的msgc通道发送数据即可,streamWriter会监听msgc通道的数据并发送到对端server;

而streamReader会在一个goroutine中循环读取对端发送来的数据,一旦接收到数据,就发送到peer的p.propc或p.recvc通道,而peer会监听这两个通道的事件,写入到node的n.propc或n.recvc通道,node只需要监听这两个通道的数据并处理即可。这就是在etcd的raft实现中server间数据交互的流程。

启动监听

对于每个server,都会创建一个raftNode,并且启动一个goroutine,执行raftNode的serveRaft方法

func (rc *raftNode) serveRaft() {
......

    err = (&http.Server{Handler: rc.transport.Handler()}).Serve(ln)
}

这个方法主要是建立一个httpserver,监听其他server的连接,处理函数为rc.transport.Handler()

原文链接

猜你喜欢

转载自blog.csdn.net/weixin_40581617/article/details/82146930