实现一个分布式协议,基于无状态,无连接,不可靠的UDP。首先可以假设它是可靠的,即不会丢包,不会乱序,加足够多的分支把这个理想情况挑出来然后先把它写出来。其他的分支暂时TODO。
common case上的并行性。VR在common case上不需要任何并行:backup只需要接受接下来的一个prepare,任何gap直接当state transfer处理。leader需要同时收集所有proposal的commit,但是一旦凑齐一个高op的quorum就不用再管低op了,可以直接commit。PBFT的情况稍微复杂,backup仍然只要接受下一个preprepare,但所有的prepare和commit都要单独凑而且必须都凑齐,这没办法。
写好的可靠情况,在它的基础上再补不可靠的情况,也就是丢包。不用专门考虑乱序,当作丢包处理就好。丢包分为影响liveness和不影响两种可能,后者整个系统还在跑,只要识别出state transfer的必要性就可以,前者一个极端的例子比如VR当中所有的preprepare全掉了,做一般的丢包实验不会丢这么多的包,所以也可以不专门写。或者写好一个对faulty leader的处理,然后当作是假阳性也行。
总之要记着,丢包就是slow path了,没必要过于追求性能,慢慢恢复就可以了。我们的目标是保证系统progress,如果用力过猛更有可能把事情搞的太复杂。