微服务实践分享(8) 控制调用中心

1.熔断

在微服务领域,熔断机制是从消费端保护微服务提供者的措施,当微服务的运行质量低于某个临界值时,启动熔断机制,暂停微服务调用一段时间,以保障后端的微服务不会因为持续过负荷而宕机。

2.降级

服务降级主要包括容错降级和屏蔽降级

屏蔽降级:1)throw null 不发起远程调用,直接返回空

2)throw exception 不发起远程调用,直接抛出指定异常

3)execute bean 不发起远程调用,直接执行本地模拟接口实现

服务降级是可逆操作,当系统压力恢复到一定值不需要降级服务时,要重新发起远程调用,服务状态改为正常

容错降级:非核心服务不可调用时,可以对故障服务做业务放通,保证主流程不受影响

1)RPC异常:通常指超时、消息解码异常、流控异常、系统拥塞保护异常等

2)Service异常 eg登录校验异常、数据库操作失败异常等

容错降级和屏蔽降级的区别在于:

1)触发条件不同:屏蔽降级往往是人工根据系统的运行,手动设置

容错降级是根据服务调用返回的结果,结合当前的服务级别,自动匹配触发

2)作用不同:容错降级是服务不可用时,让消费者执行业务放通

屏蔽降级主要目的是将原属于降级业务的资源调配出来供核心业务使用

3)调用机制不同,一个发起远程服务调用,一个只做本地调用

3.流量控制

当资源成为瓶颈时,服务框架需要对消费者做限流,启动流控保护机制。流量控制有多种策略,比较常用的有:针对访问速率的静态流控、针对资源占用的动态流控等。

在实践中,各种流量控制策略需要综合使用才能起到较好的效果。

动态流控

动态流控的最终目标是为了保命,并不是对流量或者访问速度做精确控制。当系统负载压力非常大时,系统进入过负载状态,可能是CPU、内存资源已经过载,也可能是应用进程内部的资源几乎耗尽,如果继续全量处理业务,可能会导致消息严重积压或者应用进程宕机。

动态流控检测的资源包括:

  • CPU使用率。
  • 内存使用率(对于Java,主要是JVM内存使用率)。
  • 队列积压率。

静态流控

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

由于微服务具备弹性伸缩、动态上线和下线等特性,因此集群中某个微服务实例的节点个数是动态变化的,采用传统的平均分配制无法做到精准的控制。

在实践中,比较成熟的集群静态流控策略是动态配额申请制,它的工作原理如下:

  1. 系统部署的时候,根据微服务节点数和静态流控QPS阈值,拿出一定比例的配额做初始分配,剩余的配额放在配额资源池中。
  2. 哪个微服务节点使用完了配额,就主动向服务注册中心申请配额。配额的申请策略:如果流控周期为T,则将周期T分成更小的周期T/N(N为经验值,默认值为10),当前的服务节点数为M个,则申请的配额为 (总QPS配额 - 已经分配的QPS配额)/M * T/N。
  3. 总的配额如果被申请完,则返回0配额给各个申请配额的服务节点,服务节点对新接入的请求消息进行流控。

用户自定义流控机制

不同的业务,存在不同的流控策略,例如基于微服务优先级的流控、基于节假日的流控、基于业务字段的流控等。底层的服务框架无法实现所有业务级的定制流控策略,因此,过于业务化的流控往往由业务通过自定义流控机制定制实现。

服务框架提供服务调用入口的拦截点和切面接口,由业务实现自定义流控。也可以提供基础的流控框架,供业务实现流控条件判断、流控执行策略等,简化业务的定制工作量。

4.隔离

由于大部分微服务采用同步接口调用,而且多个领域相关的微服务会部署在同一个进程中,很容易发生“雪崩效应”,即某个微服务提供者故障,导致调用该微服务的消费者、或者与故障微服务合设在同一个进程中的其它微服务发生级联故障,最终导致系统崩溃。

为了避免“雪崩效应”的发生,需要支持多种维度的依赖和故障隔离,以实现微服务的HA。

通信链路隔离

由于网络通信本身通常不是系统的瓶颈,因此大部分服务框架会采用多线程+单个通信链路的方式进行通信,原理如下所示:

              多线程-单链路P2P通信模式

正如前面章节所述,由于微服务使用异步非阻塞通信,单个I/O线程可以同时并发处理多个链路的消息,而且网络读写都是非阻塞的,因此采用多线程+单链路的方式进行通信性能本身问题不大。但是从可靠性角度来看,只支持单链路本身又存在一些可靠性隐患,我们从下面的案例中看下问题所在。

某互联网基地微服务架构上线之后,发现在一些时段,经常有业务超时,超时的业务没有固定规律。经定位发现当有较多的批量内容同步、语音和视频类微服务调用时,系统的整体时延就增高了很多,而且存在较突出的时延毛刺。由于这些操作获取的消息码流往往达到数M到数十兆,微服务之间又采用单链路的方式进行P2P通信,导致大码流的传输影响了其它消息的读写效率,增大了微服务的响应时延。

问题定位出来之后,对微服务之间的通信机制做了优化,节点之间支持配置多链路,每个链路之间还可以实现不同策略的隔离,例如根据消息码流大小、根据微服务的优先级等策略,实现链路级的隔离,优化之后的微服务通信机制:

        支持多链路隔离

调度资源隔离

微服务之间隔离

当多个微服务合设运行在同一个进程内部时,可以利用线程实现不同微服务之间的隔离。

对于核心微服务,发布的时候可以独占一个线程/线程池,对于非核心微服务,则可以共享同一个大的线程池,在实现微服务隔离的同时,避免线程过于膨胀:

图3-3 微服务之间故障隔离

假如非核心服务3发生故障,长时间阻塞线程池1的工作线程,其它与其共用线程池消息队列的非核心服务1和服务2只能在队列中排队等待,当服务3释放线程之后,排队的服务1和服务2可能已经超时,只能被丢弃掉,导致业务处理失败。

采用线程池隔离的核心服务1和服务2,由于各自独占线程池,拥有独立的消息队列,它的执行不受发生故障的非核心服务1影响,因此可以继续正常工作。通过独立线程池部署核心服务,可以防止故障扩散,保障核心服务的正常运行。

第三方依赖隔离

在微服务中通常会调用第三方中间件服务,例如分布式缓存服务、分布式消息队列、NoSQL服务等。只要调用第三方服务,就会涉及跨网络操作,由于客户端SDK API的封装,很多故障都是隐性的,因此,它的可靠性需要额外关注。

整体而言,第三方依赖隔离可以采用线程池 + 响应式编程(例如RxJava)的方式实现,它的原理如下所示:

1) 对第三方依赖进行分类,每种依赖对应一个独立的线程/线程池。

2) 微服务不直接调用第三方依赖的API,而是使用异步封装之后的API接口。

3) 异步调用第三方依赖API之后,获取Future对象。利用响应式编程框架,可以订阅后续的事件,接收响应,针对响应进行编程。

利用Netflix开源的hystrix + RxJava,可以快速实现第三方依赖的隔离,后续章节我们会详细介绍下如何使用。

进程级隔离

对于核心的微服务,例如商品购买、用户注册、计费等,可以采用独立部署的方式,实现高可用性。

容器隔离

微服务鼓励软件开发者将整个软件解耦为功能单一的服务,并且这些服务能够独立部署、升级和扩容。如果微服务抽象的足够好,那么微服务的这一优点将能够提升应用的敏捷性和自治理能力。

利用Docker容器部署微服务,可以带来如下几个优点:

  • 高效:Docker容器的启动和停止不需要几分钟,只要几百毫秒就足够了。使用Docker部署微服务,微服务的启动和销毁速度非常快,在高压力时,可以实现秒级弹性伸缩。
  • 高性能:Docker容器的性能接近裸的物理机,比VM平均高20%+。
  • 隔离性:利用Docker,可以实现0.1 core的隔离。基于细粒度的资源隔离机制,可以实现高密度的部署微服务,同时实现它们之间的资源层隔离,保障微服务的可靠性。
  • 可移植性:在基于虚拟机的解决方案中,应用的可移植性通常来说会受到云提供商所提供的虚拟机格式限制。如果应用程序需要部署到不同类型的虚拟机中,需要针对特定的虚拟机格式做镜像文件,新增很多额外的开发和测试工作量。Docker容器的设计理念是“一次编写,到处运行”,这可以使开发者避免上面这种限制。

基于Docker容器部署微服务,实现物理资源层隔离示意图如下所示:

图3-4  基于Docker容器的微服务隔离

VM隔离

除了Docker容器隔离,也可以使用VM对微服务进行故障隔离,相比于Docker容器,使用VM进行微服务隔离存在如下优势:

  1. 微服务的资源隔离性更好,CPU、内存、网络等可以实现完全的资源隔离。
  2. 对于已经完成硬件虚拟化的遗留系统,可以直接使用已有的VM,而不需要在VM中重新部署Docker容器。

开源:

1.Hystrix - Latency and fault tolerance library designed to isolate points of access to remote systems, services and 3rd party libraries, stop cascading failure and enable resilience in complex distributed systems where failure is inevitable.

2. Resilient HTTP - A smart HTTP client with super powers like fault tolerance, dynamic server discovery, auto balancing and reactive recovery, designed for distributed systems.

参考文献:

【1】http://www.infoq.com/cn/articles/micro-service-reliability-design

原文地址:https://www.cnblogs.com/davidwang456/p/9264919.html

时间: 2024-10-10 18:26:53

微服务实践分享(8) 控制调用中心的相关文章

京东、宅急送的微服务实践分享(下)| 架构师小组交流会

架构师小组交流会是由国内知名公司技术专家参与的技术交流会,每期选择一个时下最热门的技术话题进行实践经验分享. 第一期:来自沪江.滴滴.蘑菇街.扇贝架构师的 Docker 实践分享 第二期:来自滴滴.微博.唯品会.魅族.点评关于高可用架构的实践分享 第三期:京东.宅急送的微服务实践分享(上)第三期小组交流会邀请到了国内电商领头羊京东.宅急送技术负责人,在上篇京东.宅急送的微服务实践分享(上)中他们介绍了各自产品的微服务实践,本次他们就 API 网关的设计.服务的 Docker 化.服务测试.持续集

微服务实践分享(2)api网关

1.作用[http://chuansong.me/n/465796751848]: 一个完整的.「面向接入」的API GW需要包含以下功能: 面向运行期 对客户端实现身份认证 通信会话的秘钥协商,报文的加密与解密 日常流控与应急屏蔽 内部响应报文的场景化裁剪 支持「前正后反模型」的集成框架 报文格式的转换 业务路由的支撑 客户端优先的超时机制 全局流水号的生成与应用 面向客户端支持HTTP DNS / Direct IP 面向开发期 自助的沙盒测试环境 面向客户端友好的 SDK / Librar

2019年微服务实践第一课,网易&谐云&蘑菇街&奥思技术大咖深度分享

微服务的概念最早由Martin Fowler与James Lewis于2014年共同提出,核心思想是围绕业务能力组织服务,各个微服务可被独立部署,服务间是松耦合的关系,以及数据和治理的去中心化管理.微服务能够帮助企业应对业务复杂.频繁更新以及团队规模庞大带来的挑战,实现IT对业务创新的驱动. 1月12日,网易云主办的"微服务实践沙龙"将走进深圳,邀请业界微服务的先行者,分享落地实践过程中总结的干货经验. 报名地址:点击报名 时间:2019年1月12日 13:30-17:00 地点:广东

免费领取 | 微服务实践沙龙-上海站 大咖演讲资料分享

本文来自网易云社区. 9月1日,网易云联合谐云在上海InnoSpace举办了"微服务实践沙龙",邀请到了携程和蚂蚁金服等微服务的先行者,共同分享了落地实践过程中总结的干货经验.感谢讲师和上海小伙伴们的支持,这里将演讲资料分享给大家.网易云还会继续举办易经布道系列的活动,欢迎大家的关注和参与~ 议题1:配置中心,让微服务更『智能』 讲师:携程框架架构研发部技术专家 宋顺 宋老师的PPT暂时不能公开,这里分享他写的文章给大家学习:配置中心,让微服务更"智能" 议题2:微

微服务实践(总)-原文

本系列文章为 dockone.io 首发,转载请标明出处,以示尊重!! http://dockone.io/people/hokingyang   希望读者通过本系列文章对微服务优缺点有一个比较好的理解,以及何时使用这种架构.也许微服务架构比较适合你的应用.也许你正在开发一个大型.复杂单体式应用,日常开发和部署经验非常缓慢和痛苦,而微服务看起来是远方一个极乐世界.幸运的是,有可以参考的脱离苦海的策略,本篇文章中,我将描述如何逐步将单体式应用迁移到微服务架构. 本系列七篇文章列表如下: 微服务实战

微服务实践:什么是微服务

微服务实践:什么是微服务 微服务 微服务是一种软件架构风格,该词来源于Martin Fowler 的一篇博客.他在自己博客中阐述了微服务六个特点 一组小的服务.微服务主张把单体应用拆开成一个个小的服务单元. 基于业务能力.比如购物网站,可以有订单服务.商品服务.推荐服务等等. 微服务运行在独立的进程.比如现在的容器技术,容器可以部署在物理机上,以进程的方式进行横向扩展. 轻量级通信机制.比如HTTP通讯协议&JSON消息格式. 独立部署.每个团队在应用交付过程中,独立地开发.测试和部署自己的微服

.Net微服务实践(五)[服务发现]:Consul介绍和环境搭建

目录 介绍 服务发现 健康检查.键值存储和数据中心 架构 Consul模式 环境安装 HTTP API 和Command CLI 示例API介绍 最后 在上篇.Net微服务实践(四)[网关]:Ocelot限流熔断.缓存以及负载均衡中介绍Ocelot的限流.熔断.缓存.负载均衡以及其他一些特性,Ocelot的基本配置和功能都已经介绍完了.本篇我们会介绍服务发现Consul. 介绍 Consul是一款简单.易用.可伸缩性强的服务治理系统.主要核心功能有:服务发现.健康检查.键值存储和多数据中心. 服

微服务实践之路--RPC

微服务实践之路--RPC 重点来了,本文全面阐述一下我们的RPC是怎么实现并如何使用的,跟Kubernetes和Openstack怎么结合. 在选型一文中说到我们选定的RPC框架是Apache Thrift,它的用法是在Main方法中重启服务,在Client端连接服务去调用, 而我的想法是要跟Dubblo.HSF的用法一样,因为很多人都熟习这两个框架的用法,特别是我们好几个项目都是基于EDAS开发的,而且世面上用Dubbo的公司也很多. 顺便再说一下我们对于RPC的几点要求: 1,兼容Dubbo

Serverless 微服务实践-移动应用包分发服务

背景 阿里云函数计算是事件驱动的全托管计算服务.通过函数计算,您无需管理服务器等基础设施,只需编写代码并上传.函数计算会为您准备好计算资源,以弹性.可靠的方式运行您的代码,并提供日志查询.性能监控.报警等功能.借助于函数计算,您可以快速构建任何类型的应用和服务,无需管理和运维.而且,您只需要为代码实际运行所消耗的资源付费,代码未运行则不产生费用.移动应用的打包和分发呈现明显的峰谷效用,用户常常需要短时间内准备大量资源保障分发的实时性,完成分发后又需要及时释放资源,降低成本.这里我们提供一个 fu