微服务熔断与隔离

微服务近年来很火很热,相关的文章汗牛充栋,关于架构设计本文就不作叙述了,只谈谈在分布式服务的容错方面怎么做。

1 什么是微服务

对于微服务,我们可以简单的理解成对一个服务解耦,以降低业务系统的复杂性,将服务系统中的功能进行拆分成多个轻量的子服务,各个自服务间通过RPC实现服务间的关联,这样做的好处是将业务简单化,每个子服务可以有自己独立的编程语言,模式等且能够独立维护,独立部署,功能复用。

2 为什么需要做服务隔离与熔断

由于微服务间通过RPC来进行数据交换,所以我们可以做一个假设:在IO型服务中,假设服务A依赖服务B和服务C,而B服务和C服务有可能继续依赖其他的服务,继续下去会使得调用链路过长,技术上称1->N扇出。如果在A的链路上某个或几个被调用的子服务不可用或延迟较高,则会导致调用A服务的请求被堵住,堵住的请求会消耗占用掉系统的线程、io等资源,当该类请求越来越多,占用的计算机资源越来越多的时候,会导致系统瓶颈出现,造成其他的请求同样不可用,最终导致业务系统崩溃,又称:雪崩效应。

1->N扇形

雪崩效应

3   服务雪崩的原因

(1)某几个机器故障:例如机器的硬驱动引起的错误,或者一些特定的机器上出现一些的bug(如,内存中断或者死锁)。

(2)服务器负载发生变化:某些时候服务会因为用户行为造成请求无法及时处理从而导致雪崩,例如阿里的双十一活动,若没有提前增加机器预估流量则会造服务器压力会骤然增大二挂掉。

(3)人为因素:比如代码中的路径在某个时候出现bug

4 解决或缓解服务雪崩的方案

一般情况对于服务依赖的保护主要有3中解决方案:

(1)熔断模式:这种模式主要是参考电路熔断,如果一条线路电压过高,保险丝会熔断,防止火灾。放到我们的系统中,如果某个目标服务调用慢或者有大量超时,此时,熔断该服务的调用,对于后续调用请求,不在继续调用目标服务,直接返回,快速释放资源。如果目标服务情况好转则恢复调用。

 

(2)隔离模式:这种模式就像对系统请求按类型划分成一个个小岛的一样,当某个小岛被火少光了,不会影响到其他的小岛。例如可以对不同类型的请求使用线程池来资源隔离,每种类型的请求互不影响,如果一种类型的请求线程资源耗尽,则对后续的该类型请求直接返回,不再调用后续资源。这种模式使用场景非常多,例如将一个服务拆开,对于重要的服务使用单独服务器来部署,再或者公司最近推广的多中心。

 

(3)限流模式:上述的熔断模式和隔离模式都属于出错后的容错处理机制,而限流模式则可以称为预防模式。限流模式主要是提前对各个类型的请求设置最高的QPS阈值,若高于设置的阈值则对该请求直接返回,不再调用后续资源。这种模式不能解决服务依赖的问题,只能解决系统整体资源分配问题,因为没有被限流的请求依然有可能造成雪崩效应。

5 熔断设计

在熔断的设计主要参考了hystrix的做法。其中最重要的是三个模块:熔断请求判断算法、熔断恢复机制、熔断报警

(1)熔断请求判断机制算法:使用无锁循环队列计数,每个熔断器默认维护10个bucket,每1秒一个bucket,每个blucket记录请求的成功、失败、超时、拒绝的状态,默认错误超过50%且10秒内超过20个请求进行中断拦截。

(2)熔断恢复:对于被熔断的请求,每隔5s允许部分请求通过,若请求都是健康的(RT<250ms)则对请求健康恢复。

(3)熔断报警:对于熔断的请求打日志,异常请求超过某些设定则报警

6 隔离设计

隔离的方式一般使用两种

(1)线程池隔离模式:使用一个线程池来存储当前的请求,线程池对请求作处理,设置任务返回处理超时时间,堆积的请求堆积入线程池队列。这种方式需要为每个依赖的服务申请线程池,有一定的资源消耗,好处是可以应对突发流量(流量洪峰来临时,处理不完可将数据存储到线程池队里慢慢处理)

(2)信号量隔离模式:使用一个原子计数器(或信号量)来记录当前有多少个线程在运行,请求来先判断计数器的数值,若超过设置的最大线程个数则丢弃改类型的新请求,若不超过则执行计数操作请求来计数器+1,请求返回计数器-1。这种方式是严格的控制线程且立即返回模式,无法应对突发流量(流量洪峰来临时,处理的线程超过数量,其他的请求会直接返回,不继续去请求依赖的服务)

7 超时机制设计

超时分两种,一种是请求的等待超时,一种是请求运行超时。

等待超时:在任务入队列时设置任务入队列时间,并判断队头的任务入队列时间是否大于超时时间,超过则丢弃任务。

运行超时:直接可使用线程池提供的get方法

8 隔离与熔断代码实现

后续会放到github上

9 性能损耗测试

由于存在计数统计和线程切换等的开销,所以对每个请求会有一定的性能损耗,测试结果表明在线程池隔离模式中,平均一个请求的损耗在0.5ms以内。

测试方法:顺序请求,记录业务运行时间和隔离器运行业务的时间,请求数量500次。

变量解释:

单个请求耗时:为业务的运行时间(使用Thread.sleep()模拟);

隔离消耗=请求总用时-业务用时;

隔离评价消耗=隔离消耗/请求次数/

测试时间统计(单位ms):


单个请求耗时


请求总用时


业务用时


隔离消耗


隔离平均消耗


1


586


510


76


0.152


5


2637


2514


124


0.248


10


5248


5136


112


0.024


50


25261


25111


150


0.3


100


50265


50130


135


0.27


200


100657


100284


373


0.746

10 参考

在设计和实现的过程中参考了一些现有的设计和一些文章:

1、Hystrix官方文档:https://github.com/Netflix/Hystrix/wiki

2、Hystrix使用与分析:http://hot66hot.iteye.com/blog/2155036

3、Facebook文章:http://queue.acm.org/detail.cfm?id=2839461

4、Facebook文章:http://queue.acm.org/detail.cfm?id=2209336

4、分布式服务容错模式和实践:http://www.atatech.org/articles/31559

时间: 2024-08-29 04:45:07

微服务熔断与隔离的相关文章

基于微服务的分布式应用开发

本文讲的是基于微服务的分布式应用开发[编者的话]本文是有关使用微服务开发分布式应用的经验之谈,包括微服务的优势以及Spring Cloud框架的简要介绍等. 微服务架构设计模式对于单块设计模式而言有很多优点.核心思想就是将单个巨大的应用划分成互联的不同应用.与单块应用类似,每个微服务都有其自己的层级架构. 使用下列的模式,微服务可以轻易取得如下优点: 可扩展性. 一款典型的应用会使用3个方向的扩展.X轴扩展是指横向扩展应用,Y轴扩展是指划分不同的应用功能,Z轴扩展是指对于数据的分区(partio

从多租户隔离到高可用,谈DaoShip微服务架构演进

本文根据DCOS联盟第3期线上分享整理而成   讲师介绍姜冲 DaoCloud高级软件工程师   Docker Contributor,负责公有云构建服务.DaoShip的设计与研发. 对微服务架构设计与实现有着丰富的理论与实践经验.     大纲:   正确构建镜像的目标和所需资源,以及如何规划和构建服务: 基于优良的微服务架构设计及网络层优化,为数十万用户的服务使用提供稳定高速的构建能力: 不同运营需求下的技术架构演进: 微服务带给客户的价值.   DaoShip 作为 DaoCloud S

基于微服务和Docker容器技术的PaaS云平台架构设计

本文讲的是基于微服务和Docker容器技术的PaaS云平台架构设计[编者的话]在系统架构上,PaaS云平台主要分为微服务架构.Docker容器技术.DveOps三部分,这篇文章重点介绍微服务架构的实施. [3 天烧脑式容器存储网络训练营 | 深圳站]本次培训以容器存储和网络为主题,包括:Docker Plugin.Docker storage driver.Docker Volume Pulgin.Kubernetes Storage机制.容器网络实现原理和模型.Docker网络实现.网络插件.

微服务转型,雪崩效应是绕不过的一道坎

1.星火燎原 1.1农民眼中的微服务 本文讲的是微服务转型,雪崩效应是绕不过的一道坎,近年来,微服务就象一把燎原的大火,窜了出来并在整个技术社区烧了起来,微服务架构被认为是IT软件服务化架构演进的目标.为什么微服务这么火,微服务能给企业带来什么价值? 1.1.1 以种植农作物的思想来理解微服务 我们以耕种为例来看如何充分利用一块田地的: 先在地里种植了一排排玉米: 后来发现玉米脚下空地可以利用,再间隔一段距离再种上豆角,豆角长大后顺着玉米杆往上爬,最后紧紧地缠绕在玉米杆上: 再后来发现每排玉米之

微服务架构的核心要点和实现原理

微服务架构中职能团队的划分 传统单体架构将系统分成具有不同职责的层次,对应的项目管理也倾向于将大的团队分成不同的职能团队,主要包括:用户交互UI团队.后台业务逻辑处理团队与数据存取ORM团队.DBA团队等.每个团队只对自己分层的职责负责,并对使用方提供组件服务质量保证.如果其中一个模块化组件需要升级.更新,那么这个变更会涉及不同的分层团队,即使升级和变更的改变很小,也需要进行跨团队沟通:需求阶段需要跨团队沟通产品功能,设计阶段需要跨团队沟通设计方案,开发阶段需要跨团队沟通具体的接口定义,测试阶段

微服务基础

微服务基础篇 1: service consumer -> Proxy Server ->Load Balance -> Service Discovery -> Target Service 2: Broser curl Other -> Zuul -> Ribbon -> Euraka -> Restful API zuul: 是边缘服务,用来提供动态路由,监控,授权,安全,调度等功能,将权限控制等一些业务逻辑抽离出来,单独放到Zuul里,使得服务组件更

微服务架构下,如何打造别具一格的服务治理体验?(下)

作者介绍 张真,宜信技术研发中心高级架构师,负责基础系统架构演进与优化.服务治理.监控平台.微服务建设.DevOps平台.自动化测试框架及电子签约.短信.邮件等应用系统.早年就职于IBM中国研发中心,负责IBM WebSphere应用服务器的设计与开发.目前主要关注微服务架构实施,微智能设计思想应用,虚拟化技术应用,共识计算研究.   上文我们已经详细讲到了一些经典微服务架构的特点及问题,微服务计算平台的设计思想与抽象模型,今天就接着打造微服务计算的基础三件事这一话题,说说服务情景感知与监控和服

从Netflix的Hystrix框架理解服务熔断和服务降级

本文讲的是从Netflix的Hystrix框架理解服务熔断和服务降级,伴随着微服务架构被宣传得如火如荼,一些概念也被推到了我们面前,其实大多数概念以前就有,但很少被提的这么频繁.想起有人总结的一句话,微服务架构的特点就是:"一解释就懂,一问就不知,一讨论就吵架". 其实对老外的总结能力一直特别崇拜,Kevin Kelly.Martin Fowler.Werner Vogels--,都是著名的"演讲家".正好这段时间看了些微服务.容器的相关资料,也在我们新一代产品中进

老司机的微服务架构实现,照亮你的人生 | 朱攀

编者按:前2月,向朱攀兄弟约稿,畅聊甚欢,引为知己.今刊发以飨读者! 微服务为当今群雄混战局面,从dubbo问世数载,然业界尚未有完整打包结局方案,前有小剑之<老司机带你玩PPmoney微服务>,德比软件作为前驱,集数年研究与实战,搭建平台,填埋深坑,则业界之幸! 适逢1024程序员节,一并祝各位程序猿/媛节日快乐,早日步入老司机行列 前言 微服务概念被提出来后,短时间内就成了当前互联⽹圈的⼀个技术热点,有很多互联⽹公司计划或正在进⾏微服务化改造,那么,实施微服务我们应该怎么开始呢?需要哪些基