Sentinel底层原理以及使用算法

打印 上一主题 下一主题

主题 767|帖子 767|积分 2301


前言

关于微服务项目中的服务掩护,我们会使用第三方的组件,比方Sentinel或者Hystrix,今天我来总结一下我对于Sentinel的学习。

为什么要举行服务掩护

在微服务的架构中,服务之间可以举行远程调用,如果服务1包含服务2和服务3,服务1调用服务2,如果服务1调用服务2的并发量太高,不仅会影响性能,可能还会由于耗尽服务器资源从而影响服务1和服务3,造成雪崩。
因此我使用Sentinel对服务的调用做出一些掩护步伐。
请求限流:限制接口的每秒QPS阈值
线程隔离:设置服务调用差别服务的并发线程数量的阈值,防止远程调用使用过多线程导致系统资源耗尽
服务熔断:给服务设置熔断规则,当慢调用/异常数量/异常比例达到一个阈值之后,直接走降级步伐(直接返回,进步调用性能)
线程隔离原理

对于线程隔离的底层实现,Sentinel和Hystrix差别。
基于线程池

Hystrix底层基于线程池实现线程隔离,当设置线程隔离即会给服务调用的业务分配一个线程池,来限制每个业务使用的并发线程数量。
优点:1、隔离性好,每一个服务调用业务都有独立的线程池。
2、可以异步调用
缺点:线程池的创建和使用会带来额外的开销
基于信号量

Sentinel底层基于信号量来实现,信号量是包管线程并发安全的一个并发工具类,可以限制访问特定资源的最大线程数量。
原理:初始化一个计数器即令牌数量,每有一个线程都必要获取令牌才能运行,运行竣事后开释令牌,控制访问特定资源的最大线程数量。详细可见:并发工具类:Semaphore、CountDownLatch、CyclicBarrier的作用以及用法
优点:通过计数器实现,无额外开销
缺点:隔离性一般,不支持异步调用
请求限流原理

对于请求限流,即限制请求每秒的QPS,我们先来了解固定时间窗口算法。
固定时间窗口算法

固定时间窗口算法即统计接口每一秒的请求数。

如上图,每一个窗口都是一个固定的时间段,当请求到达时判定地点时间段的计数是否到达阈值即可。
存在的标题:但是也存在很明显的标题,比方一个在1.5s到达的请求,对于每秒QP的限制,我们应该查看从0.5s到1.5s之间的请求数量,因此我们应该动态的滑动这个窗口。
滑动时间窗口算法

对应Sentinel的每秒QPS统计和开启熔断后慢时长以及异常数的统计都采用了滑动时间窗口算法。
我们采用滑动窗口算法,将每一秒分为多个窗口,我们以500ms一个窗口举例。
每秒请求数统计:对于请求数的统计,如果我们准确的统计每个时间点的请求,当一个在n秒的请求到达,只必要盘算在n-1s到n这个时间点内的请求即可,但是毫无疑问,这将会占用额外的内存空间,因此为了制止内存的开销,我们只能牺牲一些准确度。而滑动时间的请求数统计则是从n-1s时候后的第一个时区开始到该请求地点的时区里所有的请求数。

比方上图,对于一个900ms的请求,900ms-1s=-100ms,而-100ms后的第一个窗口则是0到500ms,那么其QPS则是0-500ms + 500-1000 的请求数。
存在的标题:如果一个1250ms的请求,统计的就是500-1500ms内的请求数,如果250ms到500ms以内还存在请求是不是就存在偏差了?
标题解决:对于这个标题,偏差不可制止,但是如果我们可以再次划分窗口,将窗口划分的更小更细,就会减少偏差,但是也带来了内存的开销,偏差的制止和内存的开销相反。
令牌桶算法

对于Sentinel限流,底层使用了滑动时间窗口算法,对于滑动窗口算法,我们必要包管其偏差更小,因此也带来额外的内存开销,如果我们想要对一些热门参数做出一些限制,好比一些热门商品的秒杀,我们必要做出限流,但是热门参数比力多,如果我们都使用滑动窗口算法将会带来比力大的内存开销,对于Sentinel热门参数的限流,底层使用了令牌桶的算法。
原理:界说一个令牌桶(令牌计数器),比方我们限制每秒的QPS为5,那么就以200ms生成一个令牌的速度,将生成的令牌放入令牌桶中(计数器+1),当桶满就会制止生成。每当一个请求必要通逾期,只必要获取令牌(尝试让计数器-1),由于每秒产生固定的令牌数,而请求有必要获取令牌,就能控制每秒QPS,并且采用计数器,内存占用较少。
存在的标题:如果0-1s内生成5个令牌没有请求到达,到1-2s内到达大量请求,就可能回导致20QPS
标题解决:设置令牌上限时预留一定的波动空间,来应对突发流量
漏桶算法

对于令牌桶算法,其所使用的资源较少,但是也存在标题,比方当流量突发不稳定时,QPS波动较大,就可以使用漏桶算法让每秒QPS更加安稳。
实现原理:界说一个漏桶,当请求到达时,将请求放入漏桶的队列中,而漏桶会以一定速率开释请求,即如果设置QPS为5,那么漏桶就会每200ms开释一个请求,使得请求运行,这就可以让每秒的QPS更加稳定。我们还可以设置请求的逾期时间,比方设置为2000ms,第n个请求的预期执行时间为(n-1)*200 ms,如果请求预期执行时间大于2000ms,那么新的请求就会被拒绝。
优点:请求限流,让整体QPS更加安稳

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

杀鸡焉用牛刀

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表