实现了 Basic Paxos 和 Raft 两种共识算法,用于在非拜占庭网络中的节点间达成共识。

目录

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 方法则可以对接收方返回的通道进行任意的修饰来模拟网络延时、丢包等行为。