微服务之服务保护策略【持续更新】

文章目录

线程隔离

两种实现方式
线程池隔离(Hystix隔离),每个被隔离的业务都要创建一个独立的线程池,线程过多会带来额外的CPU开销,性能一般,但隔离性更强;
信号量隔离(Sentinel隔离),不用创建线程池,性能较好,但隔离性一般。

服务保护算法

一、滑动窗口算法

固定窗口算法

1、其将时间划分为多个窗口,窗口时间跨度为Interval;

2、每个窗口分别计数统计,每有一次请求就将计数器+1,限流就是设置计数器阈值;

3、如果计数器超过限流阈值,则超过阈值的请求都被丢弃;

缺点:在特殊情况,在前一间隔中间 和 后一间隔中间,组成完整的间隔。

实现步骤

1、将窗口划分为n个更小的区间,窗口的时间跨度interval为1秒,区间数量n=2,则每个区间的时间跨度为500ms,每个区间都有计数器;

2、限流阈值依然是3,时间窗口内请求超过阈值时,超出的请求被限流;

3、窗口会根据当前请求所在时间currentTime移动,窗口范围从currentTime - interval 之后的第一个时区开始,到currentTime所在时区结束。

二、漏桶算法

实现步骤

1、将每个请求视做水滴放入漏桶进行存储;

2、漏桶以固定速率向外进行漏出请求执行,如果漏桶空了,则停止漏水;

3、如果漏桶满了,则将多余的水滴进行直接丢弃。

桶的容量取决与限流的QPS阈值和允许等待的最大超时时间。

三、令牌桶算法

实现步骤

1、以固定速率生成令牌,存入令牌桶中,如果令牌桶满了,则停止生成;

2、请求进入后,必须先尝试从桶中获取令牌,获取到令牌后才可以被处理;

3、如果令牌桶中没有令牌,则请求等待或丢弃

设置的令牌的速率不能设置为服务器处理的上限

适应场景:热点参数限流

面试题

1、Sentinel 限流和Gateway限流的区别

Gateway采用基于Redis实现的令牌桶算法
Sentinel 默认限流方式为基于滑动窗口算法,中断路器基于滑动窗口

限流后可快速失败和排队等等待,其中排队等待是基于漏桶算法

热点参数限流则是基于令牌桶算法

相关推荐
北凉军5 分钟前
java连接达梦数据库,用户名是其他库的名称无法指定库,所有mapper查询的都是以用户名相同的库内的表
java·开发语言·数据库
程序员张315 分钟前
Mybatis条件判断某属性是否等于指定字符串
java·spring boot·mybatis
wuk99815 分钟前
基于C#与三菱PLC通过TCPIP实现MC协议通信示例
java·网络·c#
沛沛老爹22 分钟前
Web转AI架构篇 Agent Skills vs MCP:工具箱与标准接口的本质区别
java·开发语言·前端·人工智能·架构·企业开发
码农小卡拉28 分钟前
Maven与Gradle选型指南:如何匹配项目的依赖管理需求
java·gradle·maven
黎雁·泠崖31 分钟前
吃透Java操作符进阶:算术+移位操作符 全解析(Java&C区别+完整案例+避坑指南)
java·c语言·python
Yu_iChan1 小时前
Day10 用户端订单模块
java
菜鸟233号1 小时前
力扣377 组合总和 Ⅳ java实现
java·数据结构·算法·leetcode
星火开发设计2 小时前
Java面向对象三大特性:封装、继承与多态的深度解析及实战
java·开发语言·microsoft·多态·继承·面向对象·封装