Hbase-0.98.6源码分析--Nonce管理机制源码分析

       在《Hbase-0.98.6源码分析--Put写操作Client端流程》这篇文章中,我们介绍了Put写操作在Client端的操作流程,在介绍其中submit()方法的时候,出现了一个陌生的名词——Nonce机制,今天就来仔细的介绍下不可或缺的Nonce管理机制。

        HBase具有很强大的容错特性,而在网络世界,网络出现不稳定状况是默认一定,HBase肯定对此进行了针对性的容错处理,即客户端提交RPC请求之后,由于各种原因,服务器端的响应很可能会超时,会出现服务端已经处理完毕,但是无法通知客户端的情况。此时客户端没有收到回应,会将申请重新发送,直到重试次数达到指定参数之后,才退出申请逻辑。但这样的处理方式也会引发如下的一系列问题:append操作为例,原本客户端只想添加一条KeyValue数据到数据库,但由于服务端响应超时,会导致append申请重复多次发送,造成的结果是是目标数据在服务端被多次添加,出现append操作冗余的情况。

       那么HBase是如何解决上述的问题呢?

       为了防止该情况发生,HBase对外声明了Nonce管理功能(通过ServerNonceManager类),客户端的每次申请及重复申请使用同一个nonce进行描述,发送到服务端以后,服务端会首先判断该nonce是否存在,如果不存在则可放心执行nonce所对应操作(如append或increment)。否则需要根据当前nonce的状态进行相应的回调处理:
       1、如果nonce处于WAIT状态,表明该nonce所对应的操作正在被执行,当前线程需等待其执行结束,在根据其执行结果做进一步的处理;
       2、如果nonce处于PROCEED状态,表明该nonce所对应的操作已经被执行,只不过执行结果以失败而告终,因此在这里可重新执行;
       3、如果nonce处于DONT_PROCEED状态,表明该nonce所对应的操作已经成功被执行,这里无需在做处理。
       因此,当nonce进入DONT_PROCEED状态以后,所有通过它来执行的操作都将被忽略掉,从而防止了操作冗余的情况发生。需要注意的是当nonce计入DONT_PROCEED或PROCEED状态后,其可存活的时间是受参数控制的(hbase.server.hashNonce.gracePeriod),默认为30分钟。30分钟之后,ServerNonceManager会将该nonce进行删除,通过其cleanUpOldNonces方法。

       在HRegionServer中,有一个ServerNonceManager类型的成员变量nonceManager,由它负责管理该RegionServer上的nonce。其定义如下:


       在ServerNonceManager类内部,存在一个内部类OperationContext,它定义了nonce的三种状态:


       ServerNonceManager类中有一个十分重要的方法,用于当一个操作在服务端执行后未及时反馈响应给客户端,客户端重新发起携带相同nonceGroup和nonce的同一操作的请求时,服务端根据nonceGroup和nonce做相应的判断。定义如下:


      在HRegionServer的append()方法中,就采用了Nonce管理:


       其中,startNonceOperation()方法会调用RegionServer上nonceManager的startOperation()方法,确定是否可以执行该操作。源码如下:



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值