SockIOPool

1. SockIOPool – SockIO池化管理,为上层提供的接口是实例化函数[主要是指定memcached服务器地址,各个
机器的权重];根据key&hashCode获取SockIO-网络链接句柄;根据服务器地址获取SockIO;关闭池。上层在获取
到SockIO后能够进行读写操做,在正常使用完SockIO后将其归还给池,若是在使用过程当中出现问题则将这个网络
链接关闭,同时还暴露了SocketChannel提供了进行NIO编程的接口。
SockIOPool有在static可见范围维护一个String池名到SockIOPool的映射。
SockIO进入availPool或者busyPool都会把进入的时间写入,做为空闲时间或者使用时间的参考
------------------
2. SockIOPool属性
    boolean initialized = false – 初始化是否完成的标志,只有初始化完成后上层才能正常使用池
    int initConn = 10 – 初始化时对每一个服务器创建的链接数目
    int minConn = 5 – 每一个服务器创建最小的链接数,当自查线程发现与某个服务器创建链接数目小于这个数目时
    会弥补剩下的链接
    int maxConn = 100 -每一个服务器创建最大的链接数,当自查线程发现与某个服务器创建链接数目大于这个数目
    时就会逐个检查这些链接的空闲时间是否大于maxConn,若是大于会关闭这些链接,直到链接数等于maxConn
    long maxIdle = 1000 * 60 * 5 – 最大空闲时间
    long maxBusyTime = 1000 * 30 – 最长租用时间,其使用主要有两点,一是自查线程会检查正在被租用的链接,
    若是发现已经被租用的时间超过这个值得,会将其从被租用的记录里剔除,并关闭这个链接;另外一个应用是
    上层进行MUTIL操做时,读取全部的数据的时间不能超过这个时间。
    long maintSleep = 1000 * 30 – 自查线程周期进行工做,其每次休眠时间
    int socketTO = 1000 * 3 – Socket阻塞读取数据的超时时间
    int socketConnectTO = 1000 * 3 - Socket阻塞创建链接的等待时间
    boolean aliveCheck = false -根据key&hashCode获取SockIO时,经过hash bucket获得SockIO后,若是这个值
    是true会检查Socket是否已经链接,若是链接创建正常还会想服务器发送“version\r\n”的指令,并读取数据,这
    个过程没有出错才会返回SockIO给上层用,不然返回NULL。因此通常设置为false。
    boolean nagle = false – Socket的参数,若是是true在写数据时不缓冲,当即发送出去
    int hashingAlg = NATIVE_HASH – 池的hash bucket方式,主要是分为简单的hashCode取hash bucket数目的模
    和一致性哈希,前者在扩容时会形成命中率很大程度的降低,后者的好处是扩容时很大程度减小了缓存的从新
    分布
    String[] servers – memcached服务器地址配置
    Integer[] weights – memcached服务器权重配置
    List<String> buckets - hash bucket,一个服务器地址,其权重是N,则往这个bucket中添加N个服务器地址
    TreeMap<Long, String> consistentBuckets – 一致性哈希表:一个服务器地址,其权重是N,则迭代0 - N-1,取
    字符串服务器地址+i的MD5值,将这个MD5值分红4段,每段转换成Long值,将这个Long值到服务器地址放入
    到一致性哈希表中
    Map<String, Date> hostDead – 用来记录本地和哪一个服务器地址创建链接失败的最近时间的MAP
    Map<String, Long> hostDeadDur – 若是hostDead包含服务器地址,说明上次创建链接失败了,那么会到
    hostDeadDur里取这个服务器不必尝试链接时间间隔的值,若是上次失败时间+不必尝试链接时间间隔则
    不会发起链接。在每次链接服务器失败后,会替换hostDead里最近时间,同时替换hostDeadDur的时间间隔
   值,这个值初始是1000ms,每失败一次翻倍一次。
    Map<String, Map<SockIO, Long>> availPool – 当前可用的链接记录
    Map<String, Map<SockIO, Long>> busyPool – 当前工做的链接记录
    Map<SockIO, Integer> deadPool – 用来保持应该关闭链接的SockIO,自查线程会将里面的全部的SockIO的链接
   关闭
    boolean failover/failback
------------------
3. 池初始化
在初始化阶段主要是完成一些值的初始化,再就是根据hashingAlg来设置hash bucket,若是是
CONSISTENT_HASH则使用上面提到的一致性HASH算法创建一致性哈希表,若是不是则使用上面提到的创建
hash bucket,接下来根据initConn和全部服务器地址建立数目为initConn的链接数目。若是maintSleep大于0则
启动整个链接池的自查线程。其中建立链接的逻辑以下:若是hostDead和hostDeadDur都持有一个服务器地址
的时候,会看最近失败时间+不必链接时间间隔是否大于当前时间,大于的话直接放弃建立链接过程退出,
小于则发起链接,发起链接建立有三种状况,一种是在时间期限内建立成功,则清空其可能在hostDead和
hostDeadDur的记录,再将这个链接放入到availPool记录里面;一种是链接没有建立成功则将SockIO放入到
deadPool里给自查线程关闭链接和释放资源;最后一种是因为网络异常或者超时异常,第二种和第三种状况
发生则须要往hostDead和hostDeadDur里添加这个服务器地址的相关记录,同时将availPool里的这个服务器
地址的记录清除。
------------------
4. 租还SockIOPool
a. key & hashCode - 租
1. 先根据key & hashCode到hash bucket里找到其应该链接的服务器地址:若是有hashCode则直接使用
hashCode,没有则根据hashingAlg取hash值。若是是一致性哈希算法则到consistentBuckets里找计算出的大hash
值的点,没找到则取第一个;若是是其余的则hash bucket取模。
2. 到availPool里根据服务器地址找到可用的链接列表,迭代这个列表,若是有可用的则从availPool取出,
并加入到busyPool,若是不可用则加入到deadPool给自查线程关闭链接。通过上面的过程尚未获得链接则调用
上面提到的建立链接的逻辑,若是建立成功加入到busyPool。
3. 在获得一个链接SockIO后,再进行一些检查,若是链接不可用则加入到deadPool,可用若是aliveCheck
为true则会进行上面提到的自检操做,若是自检发生错误则从busyPool中移除并关闭链接。若是在2没有获得连
接,而且failover为false则直接返回再也不尝试链接到其余机器了;不然会组装一些新的key到hash bucket里去找剩
下的服务器地址按2创建链接。
b. host - 租
到availPool里根据服务器地址找到可用的链接列表,迭代这个列表,若是有可用的则从availPool取出,
并加入到busyPool,若是不可用则加入到deadPool给自查线程关闭链接。通过上面的过程尚未获得链接则调用
上面提到的建立链接的逻辑,若是建立成功加入到busyPool。
c. 还
将此链接SockIO从busyPool的记录中移除,若是链接可用则将链接加入到availPool的记录里面。
------------------
5. 自查线程
自查线程主要提供两个逻辑,启动和关闭,启动时周期性调用池的自查逻辑,关闭则经过一个是否中止标志来的
设置来标记中止,在中断可能正在休眠的自查线程。
池的自查逻辑主要是:
a. 到availPool检查各个服务器目前可用链接数目的个数,若是小于minConn则建立链接来弥补差额,建立的新
的链接加入到availPool中。
b. 再到availPool检查各个服务器目前可用链接数目的个数,若是大于maxConn会逐个检查这些链接的空闲时间
是否大于maxConn,若是大于会关闭这些链接,直到链接数等于maxConn。空闲时间的计算就是当前时间和这个
链接进入availPool时间的差值。
c. 到busyPool检查,发现某个链接已经被租用的时间超过这个值得,会将其从被租用的记录里剔除,并将其加入
到deadPool中。
d. 迭代deadPool中全部的链接,关闭这些链接。
------------------
6. 关闭过程主要是先中止自查线程,直到自查线程结束运行,再迭代availPool和busyPool将里面的网络链接
SockIO,关闭SockIO主要是关闭输入输出流,关闭Socket。算法

相关文章
相关标签/搜索