一致性读就是java的vaoilet的意思,就是写入之后再去读,一定能读到刚刚写入的值。
这就意味着读也只能去leader,因为follower是有延时的,不能保证马上读到最新的值。
但是问题来了,raft中对leader的角色是不确定的。你认为的leader在你发给他请求的时候,可能已经不是leader了,那要怎么办呢?
解决方法1 问下其他节点,确定自己是不是leader,只要半数以上认可自己是leader,那就是ok的。这里的问,其实就是心跳了
解决方法2 为了提高性能,不用每次都问其他的节点,设定一个比较短的时间,认为这个短时间内leader是不会变的。
看看源码是怎么做的:
解决返回一:
接受一致性读的请求
确认自己的leader,发送心跳给其他节点
超过半数心跳成功,就返回成功结果
解决方法2:
默认是任期的90%的时间,认为是leader没变的
private int leaderLeaseTimeRatio = 90;
leader过期的时候,和解决方法一是一样的了
没过期就是直接返回了。