parent proxy 源码学习

本文深入剖析ATS7.0.0中的ParentProxy实现,详细介绍了UML图、相关类的功能及作用,如ParentSelectionStrategy、ATSConsistentHash和ParentRoundRobin等,阐述了父代理的配置读取、更新流程以及处理策略。通过对ParentRecord、ParentResult等关键类的解析,揭示了ATS如何选择和管理父代理的过程。
摘要由CSDN通过智能技术生成

基于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 类, 轮询模块

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值