jraft

jraft源码阅读7一一致性读

2019-04-13  本文已影响0人  黄云斌huangyunbin
一致性读就是java的vaoilet的意思,就是写入之后再去读,一定能读到刚刚写入的值。

这就意味着读也只能去leader,因为follower是有延时的,不能保证马上读到最新的值。

但是问题来了,raft中对leader的角色是不确定的。你认为的leader在你发给他请求的时候,可能已经不是leader了,那要怎么办呢?

解决方法1 问下其他节点,确定自己是不是leader,只要半数以上认可自己是leader,那就是ok的。这里的问,其实就是心跳了
解决方法2 为了提高性能,不用每次都问其他的节点,设定一个比较短的时间,认为这个短时间内leader是不会变的。

看看源码是怎么做的:

解决返回一:
接受一致性读的请求


image.png

确认自己的leader,发送心跳给其他节点


image.png

超过半数心跳成功,就返回成功结果


image.png

解决方法2:
默认是任期的90%的时间,认为是leader没变的
private int leaderLeaseTimeRatio = 90;

image.png

leader过期的时候,和解决方法一是一样的了
没过期就是直接返回了。

上一篇下一篇

猜你喜欢

热点阅读