解决方案:Sentinel 集群限流设计原理
优采云 发布时间: 2020-12-04 08:14前哨群集电流限制设计原理
DefaultClusterTokenClient#initNewConnection
在此处插入图片描述
启动客户端时,将创建与TokenServer的链接,即需要在此处配置服务器的IP和端口号,如何配置?实际上,配置方法完全由您自己实现
对应的解析器,以下基于官方的Demo示例:
在此处插入图片描述
此处需要说明的配置项由ClusterGroupEntity定义,其字段定义如下:
[{"clientSet":["112.12.88.66@8729","112.12.88.67@8727"],"ip":"112.12.88.68","machineId":"112.12.88.68@8728","port":11111}]
客户端的下一步是向服务器端发送请求。与网络有关的问题不在本文讨论范围之内。接下来,我们将集中讨论服务器端如何颁发许可证。
3.2.2 DefaultTokenService详细说明
令牌服务器接收到客户端的请求,其处理条目为FlowRequestProcessor,其处理方法为:procedes * equest,最后将调用DefaultTokenService的requestToken方法。
DefaultTokenService#requestToken
在此处插入图片描述
Code @ 1:根据ruleId获取指定的电流限制规则。
Code @ 2:然后调用ClusterFlowChecker的acquierClusterToken方法来申请权限。
许可过程主要通过ClusterFlowChecker的acquierClusterToken方法实现。
在此处插入图片描述
步骤1:首先确定是否允许该许可证申请。这是因为TokenServe支持嵌入式,即支持在应用程序节点中嵌入TokenServer。为了确保许可申请请求不会对正常业务产生较大影响,请在许可申请中将此操作限制为当前操作。
一旦触发了当前限制,TOO_MANY_REQUEST状态代码将返回给客户端。 Sentinel支持按名称空间进行的当前限制,这由GlobalRequestLimiter专门实现。此类的内部集合也基于滑动窗口。其原理与FlowSlot类似,因此不在这里。为了扩展,默认的限流TPS为3W。与哨兵相关的配置将在后续文章中进行整理。
在此处插入图片描述
步骤2:根据进程ID采集器获取指标。
在此处插入图片描述
Step3:计算最新的Qps,globalThreashold,next其余三个阈值,这三个阈值的含义如下:
步骤5:当前的许可证数量不足,并且请求是高优先级处理逻辑:
步骤6:如果当前许可证不足,并且请求是正常优先级的处理逻辑,则增加阻塞相关指标的统计信息,并返回BLOCKED。
在TokenServer返回以申请许可之后,Token Client如何处理它?处理代码在FlowRuleChecker#applyTokenResult
中
在此处插入图片描述
我们可以发现,如果服务器返回OK,它将顺利通过,返回BLOCKED,然后直接返回false,并且将抛出FlowException。如果这是令牌电流限制,则如果规则操作退化为单机电流限制模式,则将执行单机限制。流。
这里介绍了集群电流限制的基本实现原理。
4、摘要
此处介绍了群集电流限制的基本原理。与单机电流限制模式的最大区别在于,群集电流限制模式需要引入TokenService来提供许可证颁发服务。该服务可以嵌入应用程序节点中,也可以独立于应用程序外部。以下是官方文档中的两张图片,简要介绍了嵌入式模式和独立模式的体系结构:
在此处插入图片描述
在此处插入图片描述
使用群集模式时的注意事项。如果将群集模式用于电流限制,则以下两个配置将无效:
在此处插入图片描述
最后,引发了一个思考问题:应该认为集群模式很高,但是在我们的项目中真的有必要吗?集群限流方式的优缺点有哪些,请留言讨论。
好的,亲爱的读者,以上是本文的全部内容,原创这并不容易,请白白投票,请单击[查找]以查看本文,这将是我写作的更多内容文章的最强动力。
欢迎您加入我的知识星球,以交流源代码,讨论体系结构,揭示体系结构设计和数十亿级别订单的实践经验,建立高质量的技术交流圈,并为明星朋友提供高质量的问答服务。长按以下两个二维码。
丁伟
三连贯的品质是我最大的鼓励
最喜欢的作者