流量控制

通过合理设置流控配置,避免消费方的并发请求数超出服务提供方的承受能力,导致服务不可用。

静态流控

静态流控主要是针对客户端的并发请求进行控制,根据SLA的约定的QPS做全局流量控制。

  • 传统静态流控设置,根据集群服务节点数量和流控阈值,计算各个节点的阈值,运行时,各个节点按照已分配的阈值进行流控(还有一种设计就是配置的流控阈值其实是节点的阈值,不是整个集群的全局数量);

    2点需要注意:

    1. 服务实例通常多线程执行,考虑线程安全,可以使用Atomic原子类进行原子操作;
    2. 到达流控阈值后拒绝请求接入,不能拒绝已有请求的服务方返回应答消息。
  • 传统方案的缺点,新服务节点的加入,已有节点的宕机,云端部署服务的弹性伸缩,导致服务实例的动态变化,预分配的方案会发生变化,重新计算;

  • 动态配额分配制,为解决静态流控的缺点,采用动态分配,原理:注册中心以流控周期T为单位,动态推送每个节点的流控阈值,节点变化时,注册中心重新计算节点阈值推送;

    1. 生产环境,节点的配置不同,采用上述总阈值/节点数的平均,导致性能高,处理块的节点,节点的配额很快用完,性能差的总是有剩余,解决方法就是注册中心做配额计算时,考虑服务节点的性能(例如服务调用时延)做加权,性能好的多分配,差的少分配;
    2. 另一种方案就是配额指标返还和重新申请,服务节点根据自身情况预测,对于分配的指标,多的就返还,少的就申请;
    3. 结合负载均衡做静态流控,消费者根据各服务节点的负载情况做加权路由,性能差的节点路由得到的消息更少,由于配额计算也根据负载做了加权调整,最终分配给性能差的接地啊配额指标也较少,这样既保证了系统的负载均衡,又实现了配额的更合理分配。
  • 动态配额申请制,配额分配解决了服务节点变化的问题,也能够改善平均主义的分配,但是还有缺点:

    1. 流控周期T比较大,节点的负载变化比较快,服务节点的负载反馈到注册中心,注册中心计算后再做配额分配,可能误差比较大;
    2. 流控周期T比较小,注册中心需要实时获取节点的性能数据计算负载情况,采集、上报、汇总、计算,会存在一定的时延,导致流控滞后产生误差;
    3. 采用配额返还和重新申请,增加了交互次数,也有有误差;
    4. 扩展性差,主要是所有压力全在注册中心;
      要解决上述问题,可以采用动态配额申请,原理:
    5. 部署时,根据服务节点数和静态流控阈值,拿出一定比例的配额做初始分配,剩余的放在资源池;
    6. 节点使用完初始分配的配额,再次申请配额;
    7. 总的配额使用完则流控。
      优点:
    8. 服务节点负载和性能数据,在节点本身计算,实时性高;
    9. 节点根据自身情况计算申请配额,保证性能好的申请更多的配额,差的申请的就少,可以更合理的调配资源,流控的精确性有保障。

动态流控

  • 动态流控因子,主要是引发动态流控的因素,包括系统资源和应用资源;
  • 分级流控,不同级别的流控屏蔽多少请求,可以想象闸门关闭情况。

并发控制

并发执行数量控制:
- 服务端全局控制;
- 消费端的流控;

连接控制

服务端消费者之间的链路数量控制:
- 服务端连接数流控;
- 服务消费者连接数流控;

并发和连接控制算法

  • 服务端算法:

    1. 获取流控阈值;
    2. 从全局rpc上下文获取并发执行数,对比阈值,小于,则对当前计数器原子自增;
    3. 等于或者大于,抛rpc流控异常;
    4. 服务调用完,并发执行数自减。
  • 消费端算法:

    1. 获取流控阈值;
    2. 从全局rpc上下文获取并发执行数,对比阈值,小于,则对当前计数器原子自增;
    3. 等于或者大于,进入wait状态,wait超时时间为服务调用的超时时间;
    4. 其他线程完成服务调用,计数器减小,如并发执行数小于阈值,wait线程被notify,退出wait,继续执行。

熔断

不知道作者在流控这里没加熔断机制,通常情况下都是,流控配合熔断一起使用。

熔断可以理解为保险丝。由于提供方故障,导致服务不可用,如果这时候我们还不停的请求,就会导致阻塞,消耗系统资源,如果这种情况发生在调用链中,情况就会更严重。
1. 闭合状态,正常调用,记录调用结果,连续多少次失败,则转换状态为熔断打开;
2. 熔断打开状态,这种状态下,不容许服务调用,返回错误,一般来说,持续多少时间进入半打开状态;
3. 熔断半开状态,这种状态,可以按比例放行部分请求,持续多少时间无调用异常或多少次调用无异常,熔断开关关闭,放行所有请求。

服务降级

大促期间,会针对核心业务做流控和熔断,而对于非核心业务,通常的处理方式则是服务降级。

屏蔽降级

大促期间的,为保证核心业务的稳定性,对非核心业务做屏蔽降级,服务放通,当服务调用时,不发起远程调用,直接返回空,异常或执行本地逻辑。

  • 屏蔽降级的流程

  • 屏蔽降级的设计实现,配置平台人工设置降级策略,配置操作可逆:

容错降级

非核心业务不可用时,对故障做业务逻辑放通。不仅仅用于业务放通,也常用于提供方在客户端执行容错逻辑,容错逻辑主要有:
1. Rpc异常:超时异常、解码异常、流控异常、阻塞异常等;
2. Service异常:校验失败异常、数据库操作异常等;

  • 容错降级的工作原理

    容错降级与屏蔽降级区别:

    1. 触发条件不同,容错是根据调用结果触发,屏蔽通常是人工干预触发;
    2. 作用不同,容错是服务不可用时做放行,屏蔽是将原本要发起远程调用的服务做本地执行或异常等,将原属于降级业务的资源调配出来供核心业务使用;
    3. 调用机制不同,容错是会发起远程调用的,屏蔽不会发起远程,只做本地;
  • 运行时容错降级,支持运行时,动态配置容错降级

业务层降级

业务层的处理通常包含一定业务逻辑和服务条用,在服务调用做降级后,业务层逻辑要支持服务降级后处理,做到业务层整体逻辑放行。

服务优先级调度

在系统资源有限的情况下,包含核心业务或高优先级的业务优先运行调度,降低低优先级服务的调度频次。

服务发布的时候支持优先级的设置。

线程调度器方案

线程调度的时候通过设置线程的优先级,理论上,高优先级的线程会优先调度,但是这种依赖底层,不一定精确。

优先级队列

基于优先级队列时,入队列,比较优先级,这样高优先的消息会先处理,但是如果持续有高优先级的消息到来,这样会导致低优先的消息得不到处理机会,一直积压。

加权优先级队列

按照不同的优先级设置不同的队列,服务请求消息按优先级入不同的队列,工作现场按照加权值从不同队列取消息处理。需要设置合理的队列数量,防止膨胀。

服务的迁入迁出

服务治理平台,支持服务动态的迁入迁出,这样就可以实现资源紧张时将低优先级的服务迁出,优先保证核心业务和高优先级的服务。

服务治理

rpc框架迈向分布式服务框架的重要的一步。服务治理包含的东西太多了,常用的:
1. 服务调用统计;
2. top统计;
3. 容量规划;
4. 日志分析;
5. 依赖关系分析;

服务治理技术的历史变迁

  • SOA 治理

    1. 服务建模:验证需求,发现和评估当前服务,服务建模和性能需求,开发治理规划;
    2. 服务组装:创建服务更新计划,创建和修改服务满足业务需求;
    3. 服务部署:确保服务的质量,功能测试、性能测试;
    4. 服务管理,生命周期管理和监控。
      缺点:
    5. 缺乏动态服务治理;
  • 分布式服务框架服务治理

  • AWS云端微服务治理

服务化后的挑战

  • 跨团队协作
  • 服务上下线管控
  • 服务安全
  • SLA保障
  • 故障定位

服务治理

目标:
1. 防止服务框架腐化:依赖关系分析,梳理不合理的依赖和调用路径,优化服务化架构,防止代码腐化;
2. 故障定位;
3. 服务管控;

  • 架构设计

  • 运行态服务治理功能设计,作者以Dubbo为案例,介绍了服务治理的一些东西:

    1. 服务列表信息;
    2. 服务消费、提供者信息;
    3. 调用日志;
    4. kpi数据;
    5. 流控等;
  • 线下服务治理,

  • 安全和权限管理,服务的调用权限,管理普通的各种功能菜单的权限

总结

一定要明白为什么需要服务治理,以及服务治理的功能内容。服务治理除了各种管控外,最重要的是通用调用日志进行调用分析,依赖关系分析,kpi性能等。

下节继续……

读-李林峰-分布式服务框架和原理14-17相关推荐

  1. 读-李林峰-分布式服务框架和原理1-7

    这哥们还写过一本netty的书,说实话这本书感觉不好,来过公司介绍过netty,讲的比较入门,因为当时在看netty源码,所以就不太感冒.后来学习公司服务框架的源码,想找本书系统了解下,又搜到这哥们, ...

  2. 读-李林峰-分布式服务框架和原理8-13

    服务调用 几个误区 NIO就是异步服务: 需要区分通信框架的NIO,不等于上层应用调用的异步,2个完全是不同角度,不是一个层面的事情,即使是底层通信的NIO也可以实现上层同步调用服务的功能: NIO的 ...

  3. 读-李林峰-分布式服务框架和原理18-21

    分布式消息追踪 先推荐个文章,云栖的https://yq.aliyun.com/articles/91435,介绍了分布式调用链的一些场景和阿里的分布式调用链组件eagle,记得原来云栖有个视频介绍这 ...

  4. 分布式服务框架dubbo原理解析 转

    alibaba有好几个分布式框架,主要有:进行远程调用(类似于RMI的这种远程调用)的(dubbo.hsf),jms消息服务(napoli.notify),KV数据库(tair)等.这个框架/工具/产 ...

  5. 分布式服务框架:原理与实践

    应用架构演进<一>: 垂直应用框架面临的挑战: 一.复杂应用的开发和维护成本变高,部署效率逐渐降低. 二.团队协作效率差,部分公共功能重复开发代码重复率居高不下. 三.系统可靠性变差.随着 ...

  6. java配置dsf,基于Spring-DM实现分布式服务框架(DSF)(一)

    评论 # re: 基于Spring-DM实现分布式服务框架(DSF)(一) 2008-04-14 17:03 赵斌 BlueDavy,你好: 最近正在研究关于"服务框架"的内容,看 ...

  7. 分布式服务框架-原理与实践:14---流量控制-学习笔记(理论篇)

    2019独角兽企业重金招聘Python工程师标准>>> 上次学了灰度发布,这次我们学习流控. ============================================ ...

  8. RSF 分布式服务框架-服务端工作原理

    为什么80%的码农都做不了架构师?>>>    这是接上一篇文章<RSF 分布式服务框架设计>之后的续作,主要是 Hasor-RSF 的请求响应工作原理以及设计思路. 非 ...

  9. 华为18级大牛倾情奉送:分布式服务框架和微服务设计原理实战文档,啃完发现涨薪如此简单

    前言 分布式服务框架不仅仅包含核心的运行时类库,还包括服务划分原则.服务化最佳实践.服务治理.服务监控.服务开发框架等,它是一套完整的解决方案,用来协助应用做服务化改造,以及指导用户如何构建适合自己业 ...

最新文章

  1. KlayGE 4.2开发计划
  2. PostgreSQL 消息平台实践
  3. js DOM Element属性和方法整理
  4. redis集群关闭 启动报错_使用虚拟机搭建 Redis 集群,实现数据库的负载均衡功能。...
  5. matlab的词云,Word Cloud (词云) - JavaScript
  6. oracle java存储过程返回值_java程序调用Oracle 存储过程 获取返回值(无返回,非结果集,结果集)...
  7. python组合数据类型选择题_python基础学习——基础数据类型练习题(二)
  8. 【计算机视觉】运动目标检测算法文献阅读笔记
  9. 此声明没有存储类或类型说明符
  10. idea无法导入java文件_java – IntelliJ IDEA无法解析spring导入的文件
  11. fanuc系统屏蔽服务器,FANUC伺服轴的屏蔽方法
  12. 风尚云网学习-本地拖拽文件夹实现gitee码云代码文件提交
  13. 在线查看Android源码
  14. MapGIS 数据管理——数据管理与显示模型架构
  15. 有关php的外国参考文献,php论文英文参考文献
  16. 常州大学/教务系统/教室相关
  17. 基于机器学习的笑脸检测
  18. 支付宝小程序与生活号可互相关联啦!
  19. 【Unity3D插件】UniRx(基于Unity的响应式编程框架)插件学习
  20. java门禁系统项目开发实现

热门文章

  1. spring-boot邮件发送功能演示(163邮箱与QQ邮箱互发)
  2. Nginx配置:worker_processes、worker_connections设置
  3. 使用JavaScript实现录入信息生成名片
  4. 免费PDF转Word?有这几个网站就够了
  5. 史上最全面的SignalR系列教程-1、认识SignalR
  6. 文远知行杯广东工业大学第十六届程序设计竞赛ABEFHI(记录)
  7. 史上最厉害的机器人完魔方,破世界纪录
  8. 百思买禁售华为手机;百度获首批自动驾驶路测号牌;美团打车上线首日被约谈丨价值早报
  9. 路由器无线网速正常,有线网速慢的解决办法
  10. SPR4: 依赖注入的三种方式