0

在 raft 的论文中,有一个图中描述的情况。 在此处输入图像描述

在 server1 重新启动后,可能会提交 entry2。

我的问题是:

如果entry2被误请求,则client的请求因server1的失败而失败。因此,客户端可能会认为错误的行为不是由状态机应用的,而实际上是在服务器 1 重新启动后执行的,如图(e)所示。

4

1 回答 1

3

使用 Raft 和任何其他基于不可靠通信的事务系统,如果网络在错误的时间发生故障,客户端的请求总是有可能返回“未定义”结果。

这个问题是固有的;见两位将军的问题

这里的“未定义”意味着客户端不知道事务是否实际提交。唯一的判断方法是打开一个新的交易,然后看看。

在软件中,这通常被报告为“可重试”异常。

处理此问题的一种实用方法是 (a) 在收到可重试异常时始终重试事务,以及 (b) 确保客户端事务始终是幂等的。

于 2018-02-28T17:19:53.947 回答