知识卡片
写后等待本地投递
内容
Follower 转发写请求后,不能在 leader 告知成功时立刻回复客户端,必须等该事务在本地投递后再返回,否则同一客户端后续读可能看不到自己的写。发散:会话内顺序通常靠额外等待补齐,而不是广播协议自动赠送。
参考来源
- 位置:《分布式系统与一致性》第7章《协调服务ZooKeeper》follower转发写请求一节(源文件:_epub-src/OEBPS/Text/chapter11.xhtml)
- 结论依据:原文以x=1的例子说明"如果follower收到转发的回复后就给客户端回复成功,那么客户端在后续发来的get请求中读取到的就会仍然是x=0。这种情况违反了ZooKeeper的一致性保证",因此"follower收到转发的回复后需要等待,直到这个事务在本地投递后,才会给客户端返回成功"。
- 原始内容:当leader收到大多数的ACK后给follower回复说其转发的请求处理成功,但这时COMMIT消息还没有被发送到follower,follower并没有把x=1这个操作投递到数据库中……follower收到转发的回复后需要等待,直到这个事务在本地投递后,才会给客户端返回成功。