实现了 Basic Paxos 和 Raft 两种共识算法,用于在非拜占庭网络中的节点间达成共识。
为了在一套框架内同时实现两种算法用于测试,需要抽取共识算法的公共行为:
type ConsensusProvider interface {
// 用于重置整个共识算法中的节点,因为在 Basic Paxos 中需要一个轮完整的算法才能达成共识
Reset()
// 提出一个新的值
Propose(value uint64) error
// 达成共识的值通过此通道输出
Commit() <-chan uint64
}
为了模拟网络行为,定义网络接口:
type Endpoint interface {
Receive(message any, ctx context.Context) (<-chan any, error)
}
type Network interface {
Send(from uint64, to uint64, message any) (<-chan any, context.CancelFunc)
Register(uid uint64, endpoint Endpoint)
}
网络层用于模拟节点之间建立网络连接的过程。 Receive
决定了节点收到消息后如何处理, ctx
参数用于通知接收方此连接是否被发送方取消; Send
方法则可以对接收方返回的通道进行任意的修饰来模拟网络延时、丢包等行为。