1.高可用——服务限流算法
1.1为什么要限制流量
因此当遇到瞬时请求量激增时,会导致接口占用过多服务器资源,使得其他请求响应速度降低或是超时,更有甚者可能导致服务器宕机。因此限流是为了
指对应用服务的请求进行限制,例如某一接口的请求限制为 100 个每秒,对超过限制的请求则进行快速失败或丢弃。
原文链接: https://www.infoq.cn/article/Qg2tX8fyw5Vt-f3HH673
1.2常见的服务限流算法
1.2.1固定窗口计数器算法
算法步骤:
- 将各个时间段划分为多个窗口
- 每个窗口内有一次请求就计数器加一
- 当达到窗口的计数器上限后,将该窗口所有请求丢弃,到达下一个时间段后,计数器重置。
优点:实现简单,易于理解
缺点:限流不够平滑,无法保证限流速率,因此无法应对突然激增的流量。
1.2.2滑动窗口计数器算法
算法步骤:
- 将时间划分为多个区间
- 在每个区间内每有一个请求就将计数器加一维持一个区间窗口,
-
每经过一个区间的时间,则抛弃最老的一个区间,并纳入最新的一个区间;
-
如果当前窗口内区间的请求计数总和超过了限制数量,则本窗口内所有的请求都被丢弃。
优点:可以应对突然激增的流量,滑动窗口计数器算法的颗粒度更小,可以提供更精确的限流控制。
缺点:限流不够平滑,相较于固定窗口计数器算法,实现起来较为复杂。
1.2.3漏桶算法
算法步骤:
- 将每个请求比作往漏桶注水,以任意速率注水
- 处理请求就是往外漏水,以给定速率漏水
-
如果桶满了,会将多余的水滴丢弃;
-
一般使用队列是实现。
优点:实现简单,易于理解。可以控制限流速率,避免系统过载。
缺点:无法应对激增的流量,因为只能以固定的速率处理请求,对系统资源利用不够友好。
1.2.4令牌桶算法
算法步骤:
- 令牌以固定的速率生成。
- 生成的令牌会放置于令牌桶,若桶满了,则将多余令牌丢弃,到达的请求从令牌桶中获取令牌处理请求。
-
如果桶空了,那么尝试取令牌的请求会被直接丢弃。
-
一般使用队列是实现。
优点:可以实现平滑处理,也可以实现短时间内处理大量请求。
令牌桶算法既能够将所有的请求平均分布到时间区间内,又能接受服务器能够承受范围内的突发请求,因此是目前使用较为广泛的一种限流算法。
2.泛化
什么是泛化关系?用一个例子简单的说:假设A是B和C的父类,B、C具有公共类(父类)A,说明A是B、C的一般化(概括,也称泛化),B、C是A的特殊化。
3.final
- final修饰的变量为常量
- final修饰方法中的参数为最终参数
- final修饰类则类不能被继承
- final修饰方法则方法不能被重写
- final不能修饰抽象类
- final修饰的方法可以被重载 但不能被重写,测试时,重写方法会报编译错误,重载则可以正常运行。
-
package com.wyt.exam; class Parent { public final void finalMethod(int x) { System.out.println("Final method in Parent with one parameter: " + x); } } class Child extends Parent { public final void finalMethod(int x, int y) { System.out.println("Overloaded method in Child with two parameters: " + x + ", " + y); } } public class Main { public static void main(String[] args) { Child child = new Child(); child.finalMethod(10); // 调用父类的finalMethod方法 child.finalMethod(20, 30); // 调用子类的finalMethod方法 } }
- 重载的运行结果。
4.异常
下图为java中的异常层次结构