raft 的行为 "Committing entries from previous terms" 会不会导致意想不到的结果?

Will the behavior "Committing entries from previous terms" of raft cause unexpected result?

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

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

我的问题是:

如果错误请求了entry2,是因为server1失败导致client请求失败。因此,客户端可能认为错误的行为不是由状态机应用的,实际上状态机在 server1 重启后应用,如图 (e)。

使用 Raft 和任何其他基于不可靠通信的事务系统,如果网络在错误的时间发生故障,客户端的请求总是有可能 return 得到 "undefined" 结果。

这个问题是天生的;参见 Two Generals' Problem

这里"undefined"表示客户端不知道事务是否真正提交。唯一的判断方法是打开一个新的交易并查看。

在软件中,这通常被报告为 "retryable" 异常。

解决这个问题的一个实用方法是 (a) 在出现可重试异常时始终重试事务,以及 (b) 确保客户端事务始终是幂等的。