请求拦截

  请求拦截是指当我们的系统压力比较大的时候, 牺牲掉对我们系统访问的一部分重要性稍低的请求,直接对请求进行拦截,减少系统压力,保障系统的稳定性。具体拦截哪些业务方的请求,什么接口,或者接口允许访问的大QPS是多少,这些好能做成可配置化,在紧急情况下可以灵活调整。

  强弱依赖设计

  在系统设计时,需要考虑所有系统内部访问的其他系统接口为强依赖还是弱依赖。比如对于某个功能点,内部需要调用其他系统的接口A和B,如果A出现异常则该功能不可用,而B出现异常,不会影响该功能的整体可用性,那么我们需要将A设计为强依赖,B设计为弱依赖。

  强弱依赖的设计对于系统整体的可用性非常重要,特别是在极端访问量的情况下。我们要尽可能的保证系统功能不受弱依赖系统的影响。 并且强弱依赖需要独立的测试场景来持续保障,以防强弱依赖的设计因为代码的不断改动而发生意料之外的改变。

  容灾测试方法

  业务降级、数据备份、以及请求的拦截这类的容灾场景一般都会有自己独立的业务测试方法,也会有对应的开关去控制,只需将开关设置到对应状态,使用和普通业务测试相同的方法即可。

  对于自动流控的测试,可以将阀值调整的开关设置为低值,即等同于业务的降级测试;也可以将阀值设置为一个较低的值,并模拟依赖系统的请求变慢,再进行业务测试来达到触发流控的条件。

  对于强弱依赖的测试可以直接模拟和依赖系统之间的网络不通,或者网络变慢,从而模拟依赖系统返回的请求超时或者变慢的场景,再进行业务测试观察系统各功能点的可用性。具体模拟网络不通或者变慢超时的方式如下:

  模拟网络不通

  1、使用iptbables直接模拟系统和某系统之间的网络不通:

  sudo iptables -A OUTPUT -o eth0 -d <依赖系统的IP>  -j DROP

  这个命令需要在我们被测系统上执行,并且将需要模拟的依赖系统的IP替换掉。它的主要作用是将我们被测机器往依赖系统这个IP上发送的所有的网络包给丢弃掉,依赖系统接收不到任何我们发送的包,自然也不会做任何回应。相当于系统接口的调用没有返回。

  2、使用iptables直接模拟系统的某个端口不通

  sudo iptables -A OUTPUT -o eth0 -p tcp  --dport <端口号> -j DROP

  这个命令同样需要在被测系统上执行。它的主要作用是将我们被测机器通过这个端口发送的所有的包给丢弃掉。

  3、清除所有设置的iptables规则:iptables –F

  4、查看当前设置的所有iptables规则:iptables –L

  模拟应用变慢和超时

  添加对某个依赖系统的流量控制,下面的命令需要按照顺序执行:

  1、使用ifconfig查看默认的网卡信息,一般默认为eth0

  2、使用tc流量控制命令将eth0网口过来的数据包延迟1000ms

  sudo tc qdisc add dev eth0 root handle 1: prio
  sudo tc qdisc add dev eth0 parent 1:3 handle 30: tbf rate 20kbit buffer 1600 limit  3000
  sudo tc qdisc add dev eth0 parent 30:1 handle 31: netem delay 1000ms 10ms distribution normal

  3、添加从某ip过来的流控规则(替换**.**.**.**为需要流控的ip)

  sudo tc filter add dev eth0 protocol ip parent 1:0 prio 3 u32 match ip dst **.**.**.**/32 flowid 1:3

  查看已经设置的限流规则: sudo tc filter list dev eth0 parent 1:0

  删除已经设置的所有的限流规则: sudo tc filter del dev eth0 parent 1:0 prio 3 u32