在raft的论文中,有一个由图描述的情况。

server1重启后可能会提交entry2。
我的问题是:
如果错误地请求了entry2,则客户端的请求会因为server1失败而失败。因此,客户端可能认为错误的行为不是由状态机应用的,而状态机实际上是在server1重启之后应用的,如图(E)所示。
发布于 2018-03-01 01:19:54
使用Raft和任何其他基于不可靠通信的事务系统,如果网络在错误的时间发生故障,客户端的请求总是有可能返回“未定义的”结果。
这个问题是固有的;请参阅Two Generals' Problem。
这里的“未定义”意味着客户端不知道事务是否被实际提交。唯一的办法就是打开一个新的事务,然后看一看。
在软件中,这通常被报告为“可重试”异常。
解决这个问题的一种实用方法是(a)在获得可重试异常时始终重试事务,以及(b)确保客户端事务始终是幂等的。
https://stackoverflow.com/questions/49034091
复制相似问题