背景
HBase是一个分布式数据库
当遇到宕机,客户端如何识别数据的迁移?
当遇到数据region 分裂,如何识别到最新的数据region
当遇到网络抖动等导致请求失败,客户端如何处理失败的请求?
入手
首先,我们知道hbase客户端有重试次数参数设置
hbase.client.retries.number在很多类中被调用
其中在RpcRetryingCallerFactory中有被使用
reties=hbase.client.retries.number
另外从另一个角度入手(一个方向不好入手的时候,试着从另外角度入手)
如果看过HBase的度写链路也可以知道RPC caller的实现为RpcRetryingCaller
看类名也可以知道这是一个支持重试的caller
让我们具体看一下RpcRetryingCaller中如何应用reties的
可以看到在callWithRetries方法中被用到(从方法名可以看到这个是专门做重试的方法)
callWithRetries代码说明
每次重试的间隔sleep时间
见上面代码的
expectedSleep = callable.sleep(pause,tries);
callable.sleep方法的实现:
sleep包含两部分,第一部分getPauseTime
数组下标为重试次数,
1.通过第N次重试找到对应数组元素数字,再* pause
数组的作用:随着重试次数的累加,间隔时间应该越长,类似:一个处理原件,生产组合零件的机器出了一些故障之后,工人可能想着重新往里面填入原件,但是随着机器故障时间拉长,应该减少重复的失败操作,甚至停止操作(设置重试次数),而不是一直不断高频的重试
2.再加上一个随机的数值,防止所有操作同时开始重试
此方法用到的数组
|