目录
七、Sentinel的限流与Gateway的限流有什么差别?
八、Sentinel的线程隔离与Hystix的线程隔离有什么差别?
(8)Sentinel的限流与Gateway的限流有什么差别?
问题说明:这个题目主要考察对SpringCloud的组件基本了解
难易程度:简单
参考话术:
SpringCloud包含的组件很多,有很多功能是重复的。其中最常用组件包括:
? 注册中心组件: Eureka 、 Nacos 等? 负载均衡组件: Ribbon? 远程调用组件: OpenFeign? 网关组件: Zuul 、 Gateway? 服务保护组件: Hystrix 、 Sentinel? 服务配置管理组件: SpringCloudConfig 、 Nacos
sentinel源码分析? ? ? ? ? ? ? ? ?
nacos的分级存储模型:命名空间 ->分组->服务->集群->实例(IP+端口)
Nacos的服务注册表结构是怎样的?
问题说明:考察对Nacos数据分级结构的了解,以及Nacos源码的掌握情况
难易程度:一般
参考话术:
Nacos采用了数据的分级存储模型,最外层是Namespace,用来隔离环境。然后是Group,用来对服务分组。接下来就是服务(Service)了,一个服务包含多个实例,但是可能处于不同机房,因此Service下有多个集群(Cluster),Cluster下是不同的实例(Instance)。
对应到Java代码中,Nacos采用了一个多层的Map来表示。结构为Map<String, Map<String, Service>>,其中最外层Map的key就是namespaceId,值是一个Map。内层Map的key是group拼接serviceName,值是Service对象。Service对象内部又是一个Map,key是集群名称,值是Cluster对象。而Cluster对象内部维护了Instance的集合。
下面的onChange方法是service类的方法,即服务对象自己更新服务列表。
下面的方法在cluster类。
并发读写:当一个客户端正在读取某个配置或服务信息的同时,另一个客户端对该数据进行了修改,那么读取的结果就可能是不一致的。
nacos的集群封装的实例是对象:Set<Instance>,比如修改了实例对象的数据的时候,还没改完,但是有客户端对其进行读,那么就会出现中间状态,出现脏读。
nacos临时实例:客户端发送心跳检测。
nacos永久实例:主动请求检测模式。(服务端请求客户端)
题目:假如一个窗口时间跨度为1秒钟,服务器一秒内最多处理3个请求,那么在0.5秒到1秒期间有3个请求,1秒到1.5秒期间有3个请求。这种算法有什么缺陷?
答案:第1秒内没有超过3个请求,第2秒内也没有超过3个请求,但是0.5到1.5这一秒内有6个请求,已经超出了服务器的请求数量。这就是固定窗口计数器算法的缺陷。
下面的图中请求分别在200ms、400ms、900ms、1250ms、1300ms、1400ms、1600ms、2100ms时间点过来。
窗口范围公式:当前请求的时间点 - 窗口时间跨度 = 结果,窗口范围是结果所在的窗口的下一个窗口到当前请求的所在窗口这段范围。
假如最新请求是1250ms请求,1250ms - 1000ms = 250ms,即250ms在第一个窗口,它的下一个窗口就是从500ms算起,此时的请求数量是2个。
假如最新请求是1300ms请求,1300ms - 1000ms = 300ms,即300ms在第一个窗口,它的下一个窗口就是从500ms算起,此时的请求数量是3个。
假如最新请求是1400ms请求,1400ms - 1000ms = 400ms,即400ms在第一个窗口,它的下一个窗口就是从500ms算起,此时的请求数量是4个,所以1400ms请求被拒绝。
假如最新请求是1600ms请求,1600ms - 1000ms = 600ms,即600ms在第二个窗口,它的下一个窗口就是从1000ms算起,此时的请求数量是3个。
假如最新请求是2100ms请求,2100ms - 1000ms = 1100ms,即1100ms在第三个窗口,它的下一个窗口就是从1500ms算起,此时的请求数量是2个。
问题:1250ms、1300ms、1600ms、2100ms这四个请求的时间最大时间差是850ms(2100-1250),此时一秒内有四个请求,已经超过了三个请求,这时又出现了固定窗口算法的问题。(小区间时间跨度越好越准确即窗口跨度越小越准确)
实现令牌桶算法的基本步骤如下:
- 定义一个桶,用于存放令牌。桶中有一个最大容量(maxTokens)和当前的令牌数量(currentTokens)。
- 以固定速率往桶中添加令牌,直到桶满为止。这个速率可以通过计算得出,保证在单位时间内往桶中添加一定数量的令牌。
- 当需要传输数据时,先检查桶中是否有足够的令牌。如果有足够的令牌,则取出相应数量的令牌进行传输;如果没有足够的令牌,则根据具体策略进行处理(如等待或丢弃数据包)。