微服务熔断隔离机制及注意事项

导读:本文重点分析微服务化过程中熔断机制及应用注意事项,包括微服务调用与“雪崩效应”及解决方案、熔断机制及考虑因素、隔离机制及实现方式考量等内容。
  随着企业微服务化战略的实施,业务功能细分,越来越多的服务从原有的单体应用中分解成一系列独立开发、部署、运维的微小服务,服务之间则依赖于各种RPC框架互相通信。纵然,微服务化有着很多优势,但与之伴随而来的是各种复杂性,对开发人员来说,除了业务领域本身外,还需要考虑由于服务拆分之后诸如分布式事务、服务部署及运维、rpc调用等系列问题,本文将重点分析微服务化过程中熔断机制及应用注意事项。

微服务调用与“雪崩效应”:

  微服务化之后服务之间调用关系复杂,调用层级深,服务之间依靠rpc框架进行通信,如下图1,实线是同步rpc调用,虚

图1 服务调用关系
  线则是异步rpc调用,整个调用链路从webapi开始到dinnerservice结束,红色节点则表示该服务不可用或高延迟,异步调用msgservice异常对链路返回结果并无影响,而同步调用(memberservice服务)的性能对链路则有很大影响,其会造成链路上planeservice、orderservice及webapi服务堵住,堵着的请求会耗费线程及io资源,随着此类请求越来越多,特别是在流量高峰时,如果不能及时解决memberservice的问题,最终将把整条链路堵死,造成webapi不能对外提供服务,提供崩溃,这就是所谓的雪崩效应。

雪崩效应解决方案:

  针对雪崩效应的情况,通常我们可以有如下几中方案来解决。
  一、同步调用异步化方案。如图所示,异步调用对于调用方来说,不会造成堵塞,从而将调用方保护起来。因此,可从业务层面设计入手,将不需要及时返回结果的业务调用设计成异步来调用。典型场景,注册验证码发送,消息通知等。
  二、限流方案。通过限制入口流量,将并发限制在一定范围内,能在一定程度上避免雪崩效应,如果不可用服务是部分不可用或超时时。
  以上方案都不能彻底解决问题症结,那真正比较可行的则是第三种,应用熔断隔离机制的方案。熔断,就像电路短路,当电压过高,负载加重时,保险丝就会自动断开,避免事故发生。在微服务中,当链路上某个服务不可用或延迟严重,达到熔断器设定指标阈值时,则触发熔断机制,对于后续请求直接返回默认结果或抛出异常,避免整个链路因为部分服务不可用而雪崩。隔离则是服务调用方将耗时的方法或rpc调用与业务代码隔离开来,避免耗时方法或rpc调用造成服务堵塞。

熔断机制及考虑因素:

  熔断机制具体实现体现为一个熔断器,如何实现熔断器,主要考虑以下几个方面。
  第一,熔断请求判断算法即熔断在什么条件处于开启状态,什么条件处于关闭或半关闭状态。使用滑动时间窗口来记录每个时间片内相关熔断计数指标及熔断器状态,这个时间片段称作为一个bucket,默认维护10个bucket,每1秒一个bucket,随着时间的滚动,最早的bucket抛弃,创建新的bucket到滑动窗口右边。每个blucket记录请求总数、成功数、超时数、拒绝数及熔断器状态,默认错误超过50%且10秒内超过20个请求进行中断拦截。

图2 滑动窗口
  第二、熔断恢复。默认情况下,熔断器处于闭合状态,当熔断指标达到阈值时,熔断器状态变为打开状态,此时,所有请求直接返回或抛出异常。过了一段时间后,后端异常服务经过开发运维人员及时解决了问题,熔断器如何知晓呢?如果没有一定的熔断恢复机制,那一旦熔断器打开,就不能再闭合上,显然不合情理。因此,熔断器需要有放行规则,对于熔断器开启状态超5s以内的请求,直接熔断,如果熔断器开启超过5s,则进入半开启状态,可以按一定规则,允许部分请求通过,试探性的调用被隔离的服务,若请求如是健康状态,则恢复关闭熔断器,如下图3是熔断器状态转换关系。

图3熔断器状态转换
  第三、熔断后如何处理请求。当熔断器处于打开状态时,请求直接返回,业务如何知道当前发生了状况?可向业务层抛出特定异常,用于标识当前熔断器打开,但熔断器通常通过降级措施来处理,提供提供降级接口或实现,由熔断器自行处理降级措施,开发人员只需要实现降级逻辑即可,其它事情就交给熔断器来处理。

隔离机制及实现方式考量:

  隔离机制也是为了保护微服务链路调用中避免雪崩效应的一种策略,与熔断配合使用,隔离机制可以有两种实现。
  一、线程池隔离模式:使用一个线程池来存储当前的请求,线程池对请求作处理,设置任务返回处理超时时间,堆积的请求堆积入线程池队列。这种方式需要为每个依赖的服务申请线程池,有一定的资源消耗,好处是可以应对突发流量(流量洪峰来临时,处理不完可将数据存储到线程池队里慢慢处理)。
  二、信号量隔离模式:使用一个原子计数器(或信号量)来记录当前有多少个线程在运行,请求来先判断计数器的数值,若超过设置的最大线程个数则丢弃改类型的新请求,若不超过则执行计数操作请求来计数器+1,请求返回计数器-1.这种方式是严格的控制线程且立即返回模式,无法应对突发流量(流量洪峰来临时,处理的线程超过数量,其他的请求会直接返回,不继续去请求依赖的服务)。
  线程池隔和限号量隔离机制各有利弊,在使用信号量隔离时,最大的弊端是不能实现超时返回,这有时对业务是致命的,一旦后端服务超时时间过长,已经发起的调用无法及时返回,导致资源堵塞,调用方长时间等待。而线程池隔离机制可以解决超时返回的问题,线程池隔离机制问题在于在微服务之间通过rpc调用,无论是我们自研的rpc框架,还是开源的rpc框架如dububo等,都可能会使用Threadlocal来缓存本地线程变量来传递上下文信息,服务端接收到调用的传过来请求时,需要将请求中附带的上下文信息保存到当前线程的Threadlocal变量中,当服务端调用其它其它服务时,需要将上下文信息从Threadlocal取出来再传递给下游服务,在tomcat线程模型下工作正常,但此时如果将对rpc的调用进行线程隔离后,由于线程复用问题,导致在隔离线程中执行rpc调用时服务获取不到调用线程中的Threadlocal变量,这会导致链路跟踪信息无法传递等问题,在实践中需要引起特别注意,此问题关键是要解决跨线程间Threadlocal变量传递,至于如何传递,可以参考jdk的InheritableThreadlocal机制,他解决了父子进程间Threadlocal变量继承问题,提供了一种解决此问题的思路,但线程隔离机制,比如Hystrix通常都是通过线程池来实现,避免反复创建销毁线程带来的性能损耗,但隔离线程与调用线程没有父子关系,因此需要自行解决Threadlocal变量跨线程的问题。

原文地址:http://blog.51cto.com/14084875/2325590

时间: 2024-07-30 14:54:44

微服务熔断隔离机制及注意事项的相关文章

利用Spring Cloud实现微服务- 熔断机制

1. 熔断机制介绍 在介绍熔断机制之前,我们需要了解微服务的雪崩效应.在微服务架构中,微服务是完成一个单一的业务功能,这样做的好处是可以做到解耦,每个微服务可以独立演进.但是,一个应用可能会有多个微服务组成,微服务之间的数据交互通过远程过程调用完成.这就带来一个问题,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务,这就是所谓的"扇出".如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,所谓的&

微服务熔断限流Hystrix之流聚合

简介 上一篇介绍了 Hystrix Dashboard 监控单体应用的例子,在生产环境中,监控的应用往往是一个集群,我们需要将每个实例的监控信息聚合起来分析,这就用到了 Turbine 工具.Turbine有一个重要的功能就是汇聚监控信息,并将汇聚到的监控信息提供给Hystrix Dashboard来集中展示和监控. 流程 实验 工程说明 工程名 端口 作用 eureka-server 8761 注册中心 service-hi 8762 服务提供者 service-consumer 8763 服

聊聊微服务熔断降级Hystrix

在现在的微服务使用的过程中,经常会遇到依赖的服务不可用,那么如果依赖的服务不可用的话,会导致把自己的服务也会拖死,那么就产生了熔断,熔断顾名思义就是当服务处于不可用的时候采取半开关的状态,达到一定数量后就熔断器就打开.这就相当于家里边的保险丝,如果电压过高的话,保险丝就会断掉,起到保护电器的作用. 目前支持熔断,降级的就是Hystrix,当然还有resilience4j还有Sentinel.今天咱们以Hystrix为主吧.其他的大家可以自行研究. Hystrix主要实现三个功能,接下来咱们继续展

【干货】微服务技术栈选型手册2.0

一.前言 2014年可以认为是微服务1.0的元年,当年有几个标志性事件,一是Martin Fowler在其博客上发表了"Microservices"一文,正式提出微服务架构风格:二是Netflix微服务架构经过多年大规模生产验证,最终抽象落地形成一整套开源的微服务基础组件,统称NetflixOSS,Netflix的成功经验开始被业界认可并推崇:三是Pivotal将NetflixOSS开源微服务组件集成到其Spring体系,推出Spring Cloud微服务开发技术栈. 一晃三四年过去,

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

1.熔断 在微服务领域,熔断机制是从消费端保护微服务提供者的措施,当微服务的运行质量低于某个临界值时,启动熔断机制,暂停微服务调用一段时间,以保障后端的微服务不会因为持续过负荷而宕机. 2.降级 服务降级主要包括容错降级和屏蔽降级 屏蔽降级:1)throw null 不发起远程调用,直接返回空 2)throw exception 不发起远程调用,直接抛出指定异常 3)execute bean 不发起远程调用,直接执行本地模拟接口实现 服务降级是可逆操作,当系统压力恢复到一定值不需要降级服务时,要

微服务架构技术栈选型手册¶

微服务架构技术栈选型手册 2014~2018,微服务经过三年的发展,现状如何?这是一份为让你更好使用微服务的技术站选型手册.除此之外,你还可以按需选用配套的微服务架构视频内容. 一.前言 2014 年可以认为是微服务 1.0 的元年,当年有几个标志性事件,一是 Martin Fowler 在其博客上发表了"Microservices"一文,正式提出微服务架构风格:二是 Netflix 微服务架构经过多年大规模生产验证,最终抽象落地形成一整套开源的微服务基础组件,统称 NetflixOS

spring-cloud-hystrix服务熔断与降级

Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时,异常等,Hystrix能保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性. “断路器” 本身是一种开关设置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的,可处理的备选相应(fallBack),而不是长时间的等待或者抛出调用方法无法处理的异常,这样就保证了服务调用方的线程不会长时间,不必要的占用

微服务架构的进程间通信(IPC)

先抛出几个问题: 微服务架构的交互模式有哪些? 微服务常用的进程间通信技术有哪些? 如何处理部分请求失败? API的定义需要注意的事项有哪些 微服务的通信机制与SOA的通信机制之间的关系与区别 微服务架构的交互模式 一对一还是一对多? 一对一:每个客户端请求有一个服务实例来响应 一对多:每个客户端请求有多个服务实例来响应 同步还是异步? 同步模式:客户端请求需要服务端即时响应,甚至可能由于等待而阻塞 异步模式:客户端请求不会阻塞进程,服务端的响应可以是非即时的 一对一的交互模式有以下几种方式:

Springboot/Springclound微服务架构

1.   什么是微服务? 微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成.系统中的各个微服务之间是松耦合的,同时微服务之间,通常是采用轻量级的基于 HTTP 的 RESTful API通信机制互相沟通,互相配合.每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境. 2.   微服务有什么特点? (1).复杂度可控 在将应用分解的同时,规避了原本复杂度无止境的积累.每一个微服务专注于单一功能,并通过定义良好的接口清晰表述服务边界.由于体积小.复杂度低,每个微服务可由