jedis 客户端 集群模式执行流程源码分析
流程
一.初始化流程
- 构建jedisCluster,调用父类BinaryJedisCluster构造器
- BinaryJedisCluster构造器中,构建JedisSlotBasedConnectionHandler
- JedisSlotBasedConnectionHandler构建JedisClusterInfoCache(存储集群的slots信息)
- 调用JedisClusterConnectionHandler的initializeSlotsCache(),连接集群的一个节点获取集群的slot信息,获取不到,遍历下一个节点,获取到,则break;然后构建一个slot和连接池的对应关系List<Map<slot,pool>;
二.请求流程
- 客户端调用hset
- 调用JedisClusterCommand.runWithRetries的方法,
- 通过key计算slot,从List<Map<slot,pool>;获取对应的链接池
- 从连接池中获取链接,然后执行,正常流程结束;
- 如果获取链接时新建链接时异常,或者拿到一个已经存在的链接,执行时,网络异常了,则会重试,重试次数在初始化jedisCluster时指定,默认5次
- 发生异常JedisConnectionException时,则释放链接(其实会关闭),如果重试次数只剩1次了,则会随机遍历集群节点刷新JedisClusterInfoCache(存储集群的slots信息),成功,则再次执行命令
三.技巧
- 可以通过减小重试次数,来提高客户端的敏感度,因为在最后一次重试时才会刷新slot信息,如果master飘逸了,可以尽快感知到,否则最迟需要等待2秒*5次=10秒,才能感知到