外部心跳计时器
作者: spiridonov创建于 2026年4月10日更新于 2026年6月3日
Hi! 我正在处理 https://GitHub.com/evrblk/monstera。简而言之,它基本上是一个多raft服务器。每个应用程序都被分割成多个分片,每个分片都被复制并组成一个raft组。每个Monstera节点都持有多个副本,每个分片都有一个副本。它们都彼此通信! 问题在于,即使处于空闲状态,数十个Raft实例也会不断地发送心跳,而且发送的频率很高,而且不够同步。这给传输层和Go运行时带来了不必要的负担(太多的goroutine需要同步,太多的小对象需要调度)。我曾考虑按目标节点分组/批量处理这些心跳,因为在节点1上某些raft组的多个其他副本很可能都位于节点2。但是,我对这些心跳没有任何控制。`etcd/raft`具有外部计时器,因此用户可以更好地控制心跳的触发时间。`hashicorp/raft`深度硬编码了goroutine(https://GitHub.com/hashicorp/raft/blob/main/replication.go#L141)和在`randomTimeout`中使用随机定时器(https://GitHub.com/hashicorp/raft/blob/main/util.go#L29)。你对将此功能设置为可配置的想法如何?这样我就可以为多个Raft实例提供一个单一的处理程序了。 此外,对于心跳没有特殊的消息类型。它们都是带有空`Entries`的`appendEntry`。你对通过`AppendEntries`发送心跳的方式有什么看法?我可以编写一个PR,但首先我想听听你的想法。谢谢!
内容来源: hashicorp/raft