
课程咨询: 400-996-5531
投诉建议: 400-111-8989
认真做教育 专心促就业
随着互联网的不断发展,越来越多的软件被开发推广上线,而本文我们就通过案例分析来简单了解一下,服务的自我保护方法都有哪些类型。
1、限流
正常一个长期稳定运行的服务,他们的请求是正常波形状且符合预期的,你可以观察他的流量峰值、平均值来判断服务真正的吞吐。
如果你的服务突然遇到持续性的、高频率的、不符合预期的突发流量。你需要检查一下服务是否有被错误调用、恶意攻击,或者下游程序逻辑问题。参考我的这一篇,就是的下游疯狂调用。
这种超出预期的调用经常会造成你的服务响应延迟,请求堆积,甚至服务雪崩。而雪崩会随着调用链向上传递,导致整个服务链的崩溃,对我们的系统造成很大的隐患。
限流通常指的是上游服务(服务B)这一侧,任何服务处理能力总是有限的,所以在超过他的处理能力之后,我们需要一些保护行为来避免服务过载。通常的做法就是让服务B快速返回失败来进行自我保护,否则大量请求在服务B堆积,在请求队列里阻塞,会造成大量资源损耗,也导致正常的请求无法被有效处理。
一些常见的限流方法,比如QPS限流、连接数限流,并发请求数限流等,都可以有效的对服务进行保护,下面列举几种常见的限流算法。
时间窗:简单易用
时间窗实现非常简单,大概原理是我们有一个统计的时间窗,比1分钟之内,我们只允许通过1000个请求。但是这种方法有一个比较大的缺陷,就是不太稳定。比如刚好在前10秒,就来了1000个请求,而后面50秒就不能够再接受任何请求了,非常的不均匀。所以在要求严谨的生产环境中比较少使用。
漏桶算法:定速流出
对于漏桶来说,由于它的出水口的速度是恒定的,也就是消化处理请求的速度是恒定的,所以它可以保证组件以恒定的速率来处理请求,这对一些对处理速度或者资源有严格要求的系统是非常实用的。
令牌桶:定速流入
令牌桶配了一个蓄水池,这个蓄水池通常如果请求比较少的话,那么它一直往蓄水池里面放水,就会导致这个蓄水池的容量会稍微多一些。那这样的话,在接下来的一个瞬时的流量高峰,它可以允许系统经过比这个平均速率更高一些的请求高峰。所以它有一定的弹性,在实践中也得到了非常广泛的使用。
2、熔断和降级
假设服务B非常繁忙,对于服务A正常的请求未能及时的返回结果,一直在Pending。而服务A在触发超时时间之后,按照重试策略又发了一次请求,服务B依然没有给返回。服务A经过多次重试,觉察到服务B有一些异常,他就自己做决策,认为服务B可能已经无法提供服务了,这个时候继续发出重试请求,可能意义不太大。所以它主动发起熔断(注意,是服务A发起的,因为B服务可能已经死了),就是一段时间内不再请求服务B。
A既然发起了熔断,那他总得返回对应的信息给用户,不能让用户或者更下游的服务一直等待。
这时候的处理方式就是fallback到默认的处理信息,比如跳到一个预设的函数,指定返回默认设置的静态信息。或者对返回值进行降级,比如说是之前请求成功的一些信息,或者一些缓存的旧值,这样比什么都不返回好很多。
笔者这边的做法是制定一个特定的返回结构(包含状态码、错误信息、flag),带有特定信息标志,让前端可以识别出是正常的返回还是熔断自动返回。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei456学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。