1.负载均衡
- 权重随机算法
假设我们有一组服务器 servers = [A, B, C],他们对应的权重为 weights = [5, 3, 2],权重总和为10。现在把这些权重值平铺在一维坐标值上,[0, 5) 区 间属于服务器 A,[5, 8) 区间属于服务器 B,[8, 10) 区间属于服务器 C。接下来通过 随机数生成器生成一个范围在 [0, 10) 之间的随机数,然后计算这个随机数会落到哪个 区间上。比如数字3会落到服务器 A 对应的区间上,此时返回服务器 A 即可。权重 越大的机器,在坐标轴上对应的区间范围就越大,因此随机数生成器生成的数字就会 有更大的概率落到此区间内。只要随机数生成器产生的随机数分布性很好,在经过多 次选择后,每个服务器被选中的次数比例接近其权重比例 - 最少活跃调用数算法
最少活跃调用数算法,活跃调用数越小,表明该服务提供者效率越高,单位时间内可处理更多的请求这个是比较科学的负载均衡算法。 每个服务提供者对应一个活跃数 active。初始情况下,所有服务提供者活跃数均为0。 每收到一个请求,活跃数加 1,完成请求后则将活跃数减 1。在服务运行一段时间后, 性能好的服务提供者处理请求的速度更快,因此活跃数下降的也越快,此时这样的服 务提供者能够优先获取到新的服务请求 - 一致性hash算法
- 加权轮询算法
集群容错
在集群调用失败时,Dubbo提供了多种容错方案,缺省为failover重试。
@Service(loadbalance = “random”, cluster = “failsafe”)
Failover Cluster
失败自动切换,当出现失败时,重试其他服务器。
可通过retries=2 来设置重试次数,不含第一次
Failfast Cluster
快速失败,只发一次调用,失败立即报错。
Failsafe Cluster
失败安全,出现异常,直接忽略
通常用于写入审计日志等操作。
Failback Cluster
失败自动恢复,后台记录失败请求,定时重发
通常用于消息通知操作。
Forking Cluster
并行调用多个服务器,只要一个成功即返回。 通常用于实时性要求较高的读操作,但需要浪费更多服务资源。 可通过 forks=“2” 来设置最大并行数。
服务降级
- 对一些非核心服务进行人工降级,在大促之前通过降级开关关闭哪些推荐内容、评 价等对主流程没有影响的功能
- 故障降级,比如调用的远程服务挂了,网络故障、或者 RPC 服务返回异常。 那么 可以直接降级,降级的方案比如设置默认值、采用兜底数据(系统推荐的行为广告 挂了,可以提前准备静态页面做返回)等等
- 限流降级,在秒杀这种流量比较集中并且流量特别大的情况下,因为突发访问量特 别大可能会导致系统支撑不了。这个时候可以采用限流来限制访问量。当达到阀值 时,后续的请求被降级,比如进入排队页面,比如跳转到错误页(活动太火爆,稍 后重试等)
dubbo实现服务降级
在dubbo-client端创建一个mock类,当出现服务降级时,会被调用
public class MockSayHelloService implements IHelloService {
@Override
public String sayHello() {
return “Sorry, 服务端发生异常,被降级啦!”;
}
}
修改客户端的注解,增加mock配置,以及修改timeout=1, 表示本次调用的超时时 间是1毫秒,这样可以模拟出失败的场景 需要配置cluster=failfast,否则因为默认是failover导致客户端会发起3次重试,等待 的时间比较长
@Reference(
loadbalance = “random”,
mock =
“com.springboot.practice.springbootdubboclient.MockSayHelloService”,
timeout =1000,
cluster = “failfast”) ;