通过合理设置流控配置,避免消费方的并发请求数超出服务提供方的承受能力,导致服务不可用。
静态流控主要是针对客户端的并发请求进行控制,根据SLA的约定的QPS做全局流量控制。
传统静态流控设置,根据集群服务节点数量和流控阈值,计算各个节点的阈值,运行时,各个节点按照已分配的阈值进行流控(还有一种设计就是配置的流控阈值其实是节点的阈值,不是整个集群的全局数量);
2点需要注意:
传统方案的缺点,新服务节点的加入,已有节点的宕机,云端部署服务的弹性伸缩,导致服务实例的动态变化,预分配的方案会发生变化,重新计算;
动态配额分配制,为解决静态流控的缺点,采用动态分配,原理:注册中心以流控周期T为单位,动态推送每个节点的流控阈值,节点变化时,注册中心重新计算节点阈值推送;
动态配额申请制,配额分配解决了服务节点变化的问题,也能够改善平均主义的分配,但是还有缺点:
并发执行数量控制:
- 服务端全局控制;
- 消费端的流控;
服务端消费者之间的链路数量控制:
- 服务端连接数流控;
- 服务消费者连接数流控;
服务端算法:
消费端算法:
不知道作者在流控这里没加熔断机制,通常情况下都是,流控配合熔断一起使用。
熔断可以理解为保险丝。由于提供方故障,导致服务不可用,如果这时候我们还不停的请求,就会导致阻塞,消耗系统资源,如果这种情况发生在调用链中,情况就会更严重。
1. 闭合状态,正常调用,记录调用结果,连续多少次失败,则转换状态为熔断打开;
2. 熔断打开状态,这种状态下,不容许服务调用,返回错误,一般来说,持续多少时间进入半打开状态;
3. 熔断半开状态,这种状态,可以按比例放行部分请求,持续多少时间无调用异常或多少次调用无异常,熔断开关关闭,放行所有请求。
大促期间,会针对核心业务做流控和熔断,而对于非核心业务,通常的处理方式则是服务降级。
大促期间的,为保证核心业务的稳定性,对非核心业务做屏蔽降级,服务放通,当服务调用时,不发起远程调用,直接返回空,异常或执行本地逻辑。
非核心业务不可用时,对故障做业务逻辑放通。不仅仅用于业务放通,也常用于提供方在客户端执行容错逻辑,容错逻辑主要有:
1. Rpc异常:超时异常、解码异常、流控异常、阻塞异常等;
2. Service异常:校验失败异常、数据库操作异常等;
业务层的处理通常包含一定业务逻辑和服务条用,在服务调用做降级后,业务层逻辑要支持服务降级后处理,做到业务层整体逻辑放行。
在系统资源有限的情况下,包含核心业务或高优先级的业务优先运行调度,降低低优先级服务的调度频次。
服务发布的时候支持优先级的设置。
线程调度的时候通过设置线程的优先级,理论上,高优先级的线程会优先调度,但是这种依赖底层,不一定精确。
基于优先级队列时,入队列,比较优先级,这样高优先的消息会先处理,但是如果持续有高优先级的消息到来,这样会导致低优先的消息得不到处理机会,一直积压。
按照不同的优先级设置不同的队列,服务请求消息按优先级入不同的队列,工作现场按照加权值从不同队列取消息处理。需要设置合理的队列数量,防止膨胀。
服务治理平台,支持服务动态的迁入迁出,这样就可以实现资源紧张时将低优先级的服务迁出,优先保证核心业务和高优先级的服务。
rpc框架迈向分布式服务框架的重要的一步。服务治理包含的东西太多了,常用的:
1. 服务调用统计;
2. top统计;
3. 容量规划;
4. 日志分析;
5. 依赖关系分析;
SOA 治理
目标:
1. 防止服务框架腐化:依赖关系分析,梳理不合理的依赖和调用路径,优化服务化架构,防止代码腐化;
2. 故障定位;
3. 服务管控;
一定要明白为什么需要服务治理,以及服务治理的功能内容。服务治理除了各种管控外,最重要的是通用调用日志进行调用分析,依赖关系分析,kpi性能等。
下节继续……