文章目录
机房和区域对比
常见的区域层级有:
- 同机房(IDC)
- 同区域(region上海、北京等)
在RPC服务中,region是地区概念,如北京、上海、深圳等,不做流量分配,只做灾备。即在一个 region 不可用时,可以切换到另一个 region。
region层面不做流量分配的原因:一般跨region的访问延时很高,像北京到上海有30ms。正常情况下做流量分配会对服务性能造成比较大的影响。
region 不可用的定义:region 内某一服务的可用服务器数量小于一定比例。
在特定的region下,有不同的ip段,每个ip段对应概念是逻辑机房(idc),在同region下的idc,在访问速度上没有明显区别,可以忽略地理上的差异。
ldc 层面需要做流量分配,每个ldc需要定义各自承担的流量比例。
RPC请求服务节点请求流程
在RPC服务调用流程中,往往覆盖三块核心领域:
- 区域路由算法:根据特定的区域路由算法,选取指定区域的机器提供服务
- 集群访问策略:在选取特定区域后,得到服务节点集群,根据具体的集群访问策略来访问。
- 负载均衡选取:在选取特定区域后,得到服务节点集群后,依据负载均衡算法选择合适的节点请求
其中第二点和第三点往往是整合在一起的。
区域路由
路由基础配置
下面参考开源框架pigeon中的实现,可以基于以下配置来管理RPC服务的区域路由访问策略:
-
pigeon.regions.route.enable: 是否启用区域路由策略
-
pigeon.regions: 以ip网段划分区域的归属,配置示例如:
region1:110.120,172.23;region2:192.168;region3:120.128
,注意所有的ip段都为xxx.xxx的形式,即只保留ip高16位 -
pigeon.regions.prefer.xxx,其中xxx是划分的区域名,如前面的region1,region2,region3,具体配置示例如:
pigeon.regions.prefer.region1=region1:3,region2:1,region3:0
pigeon.regions.prefer.region2=region2:10,region3:3,region1:1
pigeon.regions.prefer.region3=region3:3,region1:1,region2:0
上面配置了特定region的访问优先级策略(冒号后面为region权重,用于weight based policy)
路由算法介绍
基于不同的路由算法,服务调用方可以根据不同的需求特点来获取特定的服务提供方节点,来完成RPC服务调用。选择合适路由算法配置,可以提高RPC服务系统调用的整体可用性和调用性能。
参考pigeon框架,实现的3种调用算法包括:
- 自动切换区域路由 AutoSwitchRegionPolicy
- 基于权重区域路由 WeightBaseRegionPolicy
- 强制区域路由 ForceRegionPolicy
自动切换区域路由策略
- 按照优先级选择region中的可用client连接,当region可用率低于设置的切换阈值时,依次选择下一个优先级的region。切换阈值regionSwitchRatio默认为0.5f,即可用的client连接低于50%为region不可用。
- 在autoSwitch策略下,通过修改开关值isIdcFilterEnable,可以开启本region中的idc过滤,当同时满足以下3个条件会优先路由本地idc连接:
- 同一ip段活跃的连接数idcActive > 同一ip段总连接数idcTotal * 配置比例idcFilterThresHoldRatio
- idcActive > 最小阈值idcFilterThresholdLeast
- 同一ip段活跃的连接数idcActive > region可用连接数active * 配置比例idcFilterThresHoldRatio
基于权重区域路由
按照region权重,随机选择特定region中的可用client连接。前面通过pigeon.regions.prefer.xxx配置了客户端所在区域的优先规则,假设客户端机器所在区域为region1,则依据配置:pigeon.regions.prefer.region1=region1:5,region2:3,region3:1
,会先对所有的客户端连接实例归类到3个区域。计算总权重为9,先初始化n=0到9的随机数,在regionSet中遍历region,判断n所属region权重区域,如region1=[0,5],region2=[6,8],region3=9,根据n的值,判断所属region,返回相应region的连接,以此实现基于权重的区域路由。
强制区域路由
ForceRegionPolicy可以当作是AutoSwitchRegionPolicy的简化版,ForceRegionPolicy按照配置的region优先级,根据forceRegionConf切换规则判断是否使用优先region。切换规则参见AutoSwitchRegionPolicy。两个策略的区别是ForceRegionPolicy使用了同一路由优先级配置(pigeon.regions.force.config),不针对不同的区域有不同的优先级策略(pigeon.regions.prefer.xxx),且没有idc的细化路由策略。
集群访问
对于集群的多个节点,我们通过应用相关的集群访问策略,来提高服务请求的可用性。
常见的集群访问算法包括:
- failfast:如果使用failfast策略,会在调用失败后抛出异常。可以同时配置重试timeoutRetry和retries属性,如果配置了timeoutRetry=true(超时重试),会在因为捕获到超时异常失败后,重试调用最多retries次
- failover:调用服务的一个节点失败后会尝试调用另外的一个节点,另外一个节点的选取也是通过负载均衡算法从集群中选取,也可以同时配置重试timeoutRetry和retries属性,failover和failfast的实现区别是如果配置了超时失败重试,在超时失败后进行重试时,failover选取服务端连接会排除掉之前失败的链接,而failfast不会。
- failsafe:调用服务的一个节点失败后不会抛出异常,返回null或默认值
- forking:同时调用服务的所有可用节点,返回调用最快的节点结果数据,在forking策略中,