可以在server1重启后提交entry2。
我的问题是:
如果错误地请求了entry2,则由于server1的失败,客户端的请求失败。因此,客户端可能会认为错误的行为不是由状态机应用的,这实际上是在重启server1之后执行的,如图(e)所示。
答案 0 :(得分:3)
对于Raft以及基于不可靠通信的任何其他交易系统,客户端的请求总是有可能返回" undefined"如果网络在错误的时间出现故障,则会产生结果。
这个问题是固有的;见Two Generals' Problem。
这里" undefined"表示客户端不知道事务是否实际提交。要告诉的唯一方法是打开一个新的交易并查看。
在软件中,这通常被报告为可重试的"异常。
解决这个问题的一个实际方法是(a)在获得可重试异常时始终重试事务,(b)确保客户端事务始终是幂等的。