我已经阅读了 Raft 算法论文,并得到了一个与 Raft 在接收到客户端请求时执行的操作顺序相关的问题:
为了克服单点故障场景,Raft 依赖于在其他机器上维护一个复制的日志,该算法还参考了一个共识模块来进行完整的日志管理。操作顺序如下:
- 领导者的状态机接收到客户端请求,领导者将命令附加到其日志中。
- 领导者向他的追随者发送AppendEntries RPC 以在他们的本地日志中克隆命令,并等待大多数追随者确认该条目已成功附加到他们的本地日志文件中。
- 一旦接收到请求已成功记录在大多数追随者日志中的确认,然后该请求将提交到领导者的状态机,从而发生转换,将该转换的输出返回给客户端。
- 最终,领导者在后续的AppendEntries RPC中通知追随者提交的条目。
如果上述理解是正确的,那么我可以声称客户端请求被保留一段时间以完成复制过程,我也可以声称客户端请求的成功很大程度上取决于复制的成功进程(因为在收到多数确认之前,不会在领导者的机器上执行客户端命令/请求)。问题是,在复制过程完成后,客户端请求平均需要多长时间才能收到响应,这对于实时系统也有效吗?