服务治理利器Hystrix-理论篇
引言
现在的大中型应用,很多都在朝着服务化、分布式的方向发展。这有多方面的考虑,比如说,方便治理、便于扩展、服务隔离等等。不过在带来如此多利好的同时,不可避免的也会带来麻烦,比如系统架构复杂、服务依赖关系繁杂。整体来说,还是利大于弊,而我们需要思考的,就是怎么在得到这些利的同时,解决弊端。从本篇开始,将会用两到三篇来探讨这方面的心得。
正文
这类应用,往往会依赖几个甚至几十个服务,而服务发生故障又是不可避免的事情,即使你说自己的服务达到了四个9的高标准,那么借用网上的一个算式,如果应用A依赖了30个服务,那么出错的几率也是99.99%^30=99.70%每年大约有24个小时是不稳定的。一亿次请求*0.3%=30w次失败。有没有细思极恐的赶脚?
很多时候,我们还不得不面临,只有一个服务延迟或者挂掉,结果整个应用都受到影响。在高QPS的场景下,很快整个服务器上的资源就会被耗尽。来个图感受下(注:图片来自于网络):
服务I出问题,站在其他服务的角度看,这就是坑队友了啊。如果再有级联的依赖,简直就是噩梦。
那么怎么办呢?继续提升每个服务的可用率?当然,这是我们永远的追求,如星辰大海一般,没有止境。但也正是因此认识到,想达到100%的可用率,几乎不可能,只要有那么点缺憾的存在,那么,一旦量级起来了,刺耳的报警短信之音还是会在夜深人静的时候响起。
既然这条路走不通,或者说只能部分走通,那么还有没有其他路呢?当然有,办法总比问题多。
最常用的就是降级策略。所谓降级,无非就是愿意承担一定限度的成本,保证整体可用。举几个例子来说:
牺牲一小部分流量(其实深究起来就是用户的请求),来保证服务整体不被压垮。
不再强求一小部分服务的返回值,保证绝大多数服务可用。
当然还有缓存,牺牲数据的时效性,保证可用性。
方向性的指导原则有了,不会南辕北辙了,那么剩下的就是具体实践了,正所谓工欲善其事必先利其器。本篇,将重点研究业界流行的一件神兵利器:Hystrix。
Hystrix是通过什么手段来实现的服务降级呢?在小端看来,最核心的就是以下三点,其他的都是锦上添花的东西:
配置线程池,来控制并发量
配置超时时间,加快返回速度
配置熔断器,直接拒绝请求(舍小我保大家)
下面,详细说明:
隔离:
为每一个服务,注意,是每一个,都维护一个独立的线程池(或者信号量),当线程池满时,使用相应策略处理,比如拒绝服务,比如排队(要看配置的是哪种线程池了)。这样,就控制了并发量。不会因为突然而至的请求骤增,压垮服务。这样就实现了服务间相互隔离,彼此不受影响的效果。如下图(图片来自网络):
命令模式:
这个真没什么高深的,就是我们的业务逻辑类,要继承HystrixCommand或者HystrixObservableCommand,重写他们的run()或construct()方法。在该方法里,实现对外部服务的调用。而在使用时,就像下命令一样,对业务逻辑类实例化的对象,下达“命令”(即调用提供的统一的execute、queue等方法),而不需关心内部的具体调用逻辑,即可自动执行我们重写的run()或者construct()。
超时:
设置超时时间,那么在每个请求执行过程中,一旦发生响应超时,即可有所动作,对的,就是转而去执行getFallBack()方法,快速返回结果,释放系统资源。当然,执行失败的,也是如此处置。
熔断器:
这个词看起来高大上,知道这个词,是前几年A股里的那次事件。在这里思路其实差不多,就是我要统计一个时间窗口内,服务的成功、失败、超时等的数据,然后依据配置的策略,比如失败率达到80%时,切断服务一段时间,这时,任何请求,都拒绝服务!拒绝服务!拒绝服务!直接执行getFallBack()逻辑。比较牛的设计是,提供了自动恢复能力。可以配置一个时间阈值,在拒绝服务超过这个时长后,接受一个请求,尝试调用服务。如果成功,则服务恢复,如果失败,则继续进入熔断状态。
下篇预告
基本原理性的东西,先写这么多,下篇继续从使用层面分析。
如果对你有帮助,可以关注我的公众号,第一时间看到更多原创内容:
搜索:小端有话说
扫码:

服务治理利器Hystrix-理论篇的更多相关文章
- 14 微服务电商【黑马乐优商城】:day02-springcloud(理论篇一:HttpClient的简单使用)
本项目的笔记和资料的Download,请点击这一句话自行获取. day01-springboot(理论篇) :day01-springboot(实践篇) day02-springcloud(理论篇一: ...
- 14 微服务电商【黑马乐优商城】:day02-springcloud(理论篇四:配置Robbin负载均衡)
本项目的笔记和资料的Download,请点击这一句话自行获取. day01-springboot(理论篇) :day01-springboot(实践篇) day02-springcloud(理论篇一) ...
- ASP.NET CORE 使用Consul实现服务治理与健康检查(2)——源码篇
题外话 笔者有个习惯,就是在接触新的东西时,一定要先搞清楚新事物的基本概念和背景,对之有个相对全面的了解之后再开始进入实际的编码,这样做最主要的原因是尽量避免由于对新事物的认知误区导致更大的缺陷,Bu ...
- ASP.NET CORE 使用Consul实现服务治理与健康检查(1)——概念篇
背景 笔者所在的公司正在进行微服务改造,这其中服务治理组件是必不可少的组件之一,在一番讨论之后,最终决定放弃 Zookeeper 而采用 Consul 作为服务治理框架基础组件.主要原因是 Consu ...
- 14 微服务电商【黑马乐优商城】:day01-springboot(理论篇)
本项目的笔记和资料的Download,请点击这一句话自行获取. day01-springboot(理论篇) :day01-springboot(实践篇) :day01-springboot(Thyme ...
- 14 微服务电商【黑马乐优商城】:day02-springcloud(理论篇二:知道什么是SpringCloud)
本项目的笔记和资料的Download,请点击这一句话自行获取. day01-springboot(理论篇) :day01-springboot(实践篇) day02-springcloud(理论篇一: ...
- Spring Cloud(四):服务容错保护 Hystrix【Finchley 版】
Spring Cloud(四):服务容错保护 Hystrix[Finchley 版] 发表于 2018-04-15 | 更新于 2018-05-07 | 分布式系统中经常会出现某个基础服务不可用 ...
- 【Dalston】【第一章】 服务治理(Eureka)
Spring Cloud是一系列框架的集合,其基于Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,构建了服务治理(发现注册).配置中心.消息总线.负载均衡.断路器.数据监控.分 ...
- SQL Server ->> 高可用与灾难恢复(HADR)技术 -- AlwaysOn可用性组(理论篇)
因为篇幅原因,AlwaysOn可用性组被拆成了两部分:理论部分和实战部分.而实战部分又被拆成了准备工作和AlwaysOn可用性组搭建. 三篇文章各自的链接: SQL Server ->> ...
随机推荐
- iOS 远程消息推送,原理和开发详解篇(新手推荐)
1.APNS的推送机制 首先我们看一下苹果官方给出的对ios推送机制的解释.如下图 Provider就是我们自己程序的后台服务器,APNS是Apple Push Notification Servic ...
- 敏捷测试(5)--基于story的敏捷基础知识
基于story的敏捷基础知识----需求管理(二) (1)定期发布 定期发布上线,把整个项目划分为一个个迭代,每个迭代时间大小固定(基本固定),迭代结束时上线交付一次. (2)迭代规划 迭代规划相当于 ...
- 【翻译】EXTJS 编码风格指南与实例
原文:EXTJS Code Style Guide with examples Ext JS风格指南: 熟知的且易于学习 快速开发,易于调试,轻松部署 组织良好.可扩展和可维护 Ext JS应用程序的 ...
- 使用Visual Studio创建图片精灵(Image Sprite)——Web Essential
原文:Creating Image Sprite in Visual Studio - Web Essential 译者注:有关图片精灵的信息请参阅http://baike.baidu.com/vie ...
- linux的string操作(字符串截取,长度计算)
按指定的字符串截取 1.第一种方法: ${varible##*string} 从左向右截取最后一个string后的字符串 ${varible#*string}从左向右截取第一个string后的字符串 ...
- 【Unity技巧】统一管理回调函数——观察者模式
这次的内容有点类似设计模式里的观察者模式.但是和常规意义上的观察者模式也不是完全一致,所以各位就不要咬文嚼字啦!咦?设计模式?!不懂!没关系,说不定你以前就用过. 开场白 我们来想象一个场景.在加载一 ...
- R.java文件介绍
HelloWorld工程中的R.java文件 package com.android.hellworld; public final class R { public static final ...
- Google性能工程师Ilya Grigorik谈HTTP/2
via:http://www.infoq.com/cn/news/2014/11/http2-develop HTTP/2,也就是超文本传输协议第2版,是下一代HTTP协议.该版本是自1999年HTM ...
- SpriteBuilder中如何平均拉伸精灵帧动画的距离
首先要在Timeline中选中所有的精灵帧,可以通过如下2种的任意一种办法达成: 1按下Shift键的同时鼠标单击它们 2鼠标在Timeline空白区拖拽直到拉出的矩形包围住所有精灵帧方块后放开鼠标. ...
- Java-Cookie源码
public class Cookie implements Cloneable { private static final String LSTRING_FILE = "javax.se ...