流量控制

 我来答
舒适还明净的海鸥i
2022-06-03 · TA获得超过1.7万个赞
知道小有建树答主
回答量:380
采纳率:0%
帮助的人:67.1万
展开全部
当资源成为瓶颈时,服务框架需要对消费者做限流,启动流控保护机制。流量控制有多种策略,比较常用的有:针对访问速率的静态流控、针对资源占用的动态流控、针对消费者并发连接数的连接控制和针对并行访问数的并发控制。在实践中,各种流量控制策略需要综合使用才能起到较好的效果。

静态流控主要针对客户端访问速率进行控制,它通常根据服务质量等级协定(SLA)中约定的QPS做全局流量控制,例如订单服务的静态流控阈值为100QPS,则无论集群有多少个订单服务实例,它们总的处理速率之和不能超过100QPS。

传统的静态流控设计采用安装预分配方案,在软件安装时,根据集群服务节点个数和静态流控阈值,计算每个服务节点分摊的QPS阈值,系统运行时,各个服务节点按照自己分配的阈值进行流控,对于超出流控阈值的请求则拒绝访问。
服务架构启动时,将本节点的静态流控阈值加载到内存中,服务框架通过Handler拦截器在服务调用前做拦截计数。当计数器在指定周期T到达QPS上线时,启动流控,拒绝新的请求消息接入。
有两点需要注意:

静态分配方案的最大缺点就是忽略了服务实例的动态变化:

分布式服务框架的一个特点就是服务的动态上下线或自动发现机制,这就决定了在运行期服务节点数会随着业务量的变化而频发发生变化,在这种情境下静态分配方案显然无法满足需求。
当应用和服务迁移到云上之后PaaS平台的一个重要功能就是支持应用和服务的弹性伸缩,在云上,资源都是动态分配和调整的,静态分配阈值方案无法适应服务迁移到云上。

为了解决静态分配的缺陷,在实践中通常会采用动态配额分配制。它的工作原理:由服务注册中心以流控周期T为单位,动态推送每个节点分配的流控阈值QPS。当服务节点发生变化时,会触发服务注册中心重新计算每个节点的配额,然后进行推送,这样无论是新增还是减少服务节点数,都能够在下一个流控周期内被识别和处理,这就解决了传统静态分配方案无法适应节点数动态变化的问题。
在生产环境中,每台机器/VM的配置可能不同,如果每个服务节点采用流控总阈值/服务节点数这种平均主义,可能会发生性能高、处理快的节点配额很快用完,但是性能差的节点配额有剩余的情况,这会导致总的配额没用完,但是系统却发生了静态流控的问题。一种解决方案就是服务注册中心在做配额计算时,根据各个服务节点的性能KPI数据(例如服务调用平均延迟)做加权,处理能力差的服务节点分配的指标少些,性能高的分配的指标多些,这样就能够尽可能低地降低流控偏差。
还有另外一种解决方案就是配额指标返回和重新申请,每个服务节点根据自身分配的指标值、处理速率做预测,如果计算结果表明指标会有剩余,则把多余的返还服务注册中心;对于配额已经使用完的服务节点,重新主动去服务注册中心申请配额,如果连续N次都申请不到新的配额指标,则对于新接入的请求消息做流控。
最后一点就是结合负载均衡进行静态流控,才能够实现更精确的调度和控制。消费者根据各服务节点的负载情况做加权路由,性能差的节点路由到的消息更少,由于配额计算也根据负载做了加权调整,最终分配给性能差的节点配额指标也较少,这样既保证了系统的负载均衡,有实现了配额的更合理分配。

尽管动态配额分配制可以解决节点变化引起的流控不准问题,也能够改善平均主义配额分配导致的贫富不均,但是它并不是最优的方案,它的缺点总结如下:

动态流控的最终目标是为了保命,并不是对流量或者访问速度做精确控制。当系统负载压力非常大时,系统进入过负载状态,可能是CPU、内存资源已经过载,也可能是应用进程内部的资源几乎耗尽,如果继续全量处理业务,可能会导致长时间的Full GC、消息严重积压或者应用进程宕机,最终将压力转移到集群其他节点,引起级联故障。
触发动态流控的因子是资源,资源又分为系统资源和应用资源两大类,根据不同的资源负载情况,动态流控又分为多个级别,每个级别流控系统都不同,也就是被拒绝掉的消息比例不同。每个级别都有相应的流控阈值,这个阈值通常支持在线动态调整。

动态流控因子包括系统资源和应用资源两大类,常用的系统资源包括:

通常,动态流控是分级别的,不同级别拒掉的消息比例不同,这取决于资源的负载使用情况。例如当发生一级流控时,拒绝掉1/8的消息;发生二级流控时,拒绝掉1/4的消息。
不同的级别有不同的流控阈值,系统上线后提供默认的流控阈值,不同流控因子的流控阈值不同,业务上线之后通常会根据现场的实际情况做阈值调优,因此流控阈值需要支持在线修改和动态生效。
需要指出的是为了防止系统波动导致的偶发性流控,无论是进入流控状态还是从流控状态恢复,都需要连续采集N次并计算平均值,如果连续N次平均值大于流控阈值,则进入流控状态;同理,只有连续N次资源使用率平均值低于流控阈值,才能脱离流控状态恢复正常。
根据资源使用率的变化,流控会发生升级或者降级,在同一个流控周期内,不会发生流控级别的跳变。

并发控制针对线程的并发执行数进行控制,它的本质是限制对某个服务或者服务的方法过渡消费,耗用过多的资源而影响其他服务的正常运行。
并发控制有两种形式:

通常分布式服务框架服务提供者和消费者之间采用长连接私有协议,为了防止因为消费者连接数过多导致服务端负载压力过大,系统需要支持针对连接数进行控制。

基于服务调用Pipeline机制,可以对请求消息接收和发送、应答消息接收和发送、异常消息等切面拦截(类似Sprint的AOP机制,但是没采用反射机制,性能更高),利用Pipeline拦截切面接口,对请求消息做服务调用前的拦截和计数,根据计数器做流控,服务端的算法如下:

流量控制是保障服务SLA的重要措施,也是业务高峰期故障预防和恢复的有效手段,分布式服务框架需要支持不同的流控策略,还要支持流控阈值、策略的在线调整,不需要重启应用即可动态生效,提升线上服务治理的效率和敏捷性。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式