基于ATS7.0.0代码研究(与ATS6.1.1相差不大)
UML图:
notes:
1. ParentRecord 与 pRecord : ParentRecord 对应一条parent.config 记录, pRecord 对应一个回源IP或域名, 即 parent 或 secondary_parent 都可以配置多个下一跳的IP或域名,ParentRecord 中包含主(备)parent(secondary_parent)两个 pRecord 数组, 此时是 2:1 对应, 由于ParentRecord 里面包含多个 pRecord, 此时为 n:1 对应。
2. ParentRecord 与 ParentConfigParams :ParentConfigParams 通过 ParentTable 指针保存着所有的 parent.config 信息, 即 n:1 对应。
3. ParentRecord 与 ParentResult : 每个请求 request 都有一个ParentResult 对应着一个 ParentRecord 此时是 1:1 对应, 但是多个请求 req 的 ParentResult 可能共用一个ParentRecord 内存, 此时是 n:1 对应。
父代理的相关类介绍:
ParentSelectionStrategy 类, 基础工厂类
虚函数成员方法:
virtualvoid selectParent(const ParentSelectionPolicy *policy, bool firstCall,ParentResult *result, RequestData *rdata) = 0;
virtual void markParentDown(constParentSelectionPolicy *policy, ParentResult *result) = 0;
virtualuint32_t numParents(ParentResult *result) const = 0;
virtual voidmarkParentUp(ParentResult *result) = 0;
ParentConsistentHash 类, 内容哈希模块
相关类介绍:
ATSConsistentHash 类: (一致性内容哈希 和 其哈希配置存储)
将name域名结点node通过weight和自增变量值,计算出很多个离散的hash值出来,并存储到map中;
name(域名)查找时,先计算其哈希值,再通过map的lower_bound 函数找出对应的node结点。
成员变量:
ATSHash64Sip24 hash[2]; //哈希算法的指定,对应 parent 和 secondary_parent
ATSConsistentHash *chash[2];
//配置内容哈希值存储指针,对应 parent 和 secondary_parent, 对象实例化在ParentConsistentHash::ParentConsistentHash() 中
pRecord*parents[2];
//存储ParentRecord 的 parents 和 secondary_parents 指针, 值赋值可参考ParentConsistentHash::ParentConsistentHash()
boolfoundParents[2][MAX_PARENTS]; //此值暂时未使用
boolignore_query; //请求URL哈希时是否忽略URL的参数部分, 值赋值可参考ParentConsistentHash::ParentConsistentHash()
staticconst int PRIMARY = 0; //常变量
staticconst int SECONDARY = 1; //常变量
内容HASH分为PRIMARY(主) 和 SECONDARY(备) 两种选择
成员方法:
uint64_tgetPathHash(HttpRequestData *hrdata, ATSHash64 *h); //通过请求 hrdata 获取次请求域名对应的哈希值
voidselectParent(const ParentSelectionPolicy *policy, bool firstCall, ParentResult*result, RequestData *rdata);
//用请求rdata 通过哈希的方式在 parents[2] 查找出合适的父IP(或域名)
voidmarkParentDown(const ParentSelectionPolicy *policy, ParentResult *result);
//通过policy 和 result 中的信息,
//来更新result 对应 ParentRecord 的parents 和 secondary_parents 中父IP(或域名)的不可用状态
uint32_tnumParents(ParentResult *result) const;
//返回正在查询的parents[PRIMARY/SECONDARY] 在 parent.config 中配置父代理IP或域名的个数
voidmarkParentUp(ParentResult *result);
//通过result 中的信息, 来更新 result 对应ParentRecord 的 parents 和 secondary_parents 中父IP(或域名)的可用状态
ParentRoundRobin 类, 轮询模块