浅谈服务雪崩

服务雪崩的过程

服务关系

上面是一组简单的服务依赖关系A,B服务同时依赖于基础服务C,基础服务C又调用了服务D

D响应变慢

服务D是一个辅助类型服务,整个业务不依赖于D服务,某天D服务突然响应时间变长,导致了核心服务C响应时间变长,其上请求越积越多,C服务也出现了响应变慢的情况,由于A,B强依赖于服务C,故而一个无关紧要的服务却影响了整个系统的可用。


影响了整个系统

雪崩是系统中的蝴蝶效应导致其发生的原因多种多样,有不合理的容量设计,或者是高并发下某一个方法响应变慢,亦或是某台机器的资源耗尽。从源头上我们无法完全杜绝雪崩源头的发生,但是雪崩的根本原因来源于服务之间的强依赖,所以我们可以提前评估,做好熔断,隔离,限流。


熔断

熔断器

说到熔断器,java技术栈的同学第一时间会想到Hystrix。下面我们一起来看下熔断器的实现原理

状态转移

熔断器实际上是一个简单的有限状态机(Finite State Machine)

1.请求错误率达到某一阈值,熔断器全开,产生熔断(熔断期间会对所有请求采用降级处理)

2.到熔断时间窗口之后,熔断器会进入半开状态,此时hystrix会放过1个试验性请求

3.如果该试验性请求成功,熔断器进入关闭状态

4.如果该试验性请求失败,熔断器重新进入全开状态

以下摘自hystrix官方文档

1.Assuming the volume across a circuit meets a certain threshold (HystrixCommandProperties.circuitBreakerRequestVolumeThreshold())...

2.And assuming that the error percentage exceeds the threshold error percentage (HystrixCommandProperties.circuitBreakerErrorThresholdPercentage())...

3.Then the circuit-breaker transitions from CLOSED to OPEN.

4.While it is open, it short-circuits all requests made against that circuit-breaker.

5.After some amount of time (HystrixCommandProperties.circuitBreakerSleepWindowInMilliseconds()), the next single request is let through (this is the HALF-OPEN state). If the request fails, the circuit-breaker returns to the OPEN state for the duration of the sleep window. If the request succeeds, the circuit-breaker transitions to CLOSED and the logic in 1. takes over again.

指标Metric

hystrix内部的统计指标是基于观察者模式的,只不过事件的统计方式1.4.x与1.5.0王后的版本有些许不同。

1.4.x版本实现

摘自 https://github.com/Netflix/Hystrix/wiki/How-it-Works#circuit-breaker


采用滑动窗口+滚筒的机制进行指标统计,一个完整的时间窗口被划分为多个bucket,图中的一个bucket统计的是1s内的计数指标,分别是success,failure,timeout,rejection,熔断器评判标准是整个时间窗口的成功失败比。

1.5.0以后版本

利用了hystirx大量引入了rxjava  api,其保留了滚筒机制,只不过bucket内部的时间段指标统计利用了Observable.window 函数进行时间段内聚合统计。

rxjava window函数


Observable.window操作分为2个维度,分别是bucket级别和window级别。

bucket级别的数据聚合是在BucketedCounterStream.java类中执行,其功能是将服务调用级别的输入数据流 inputEventStream 以 bucketSizeInMs 毫秒为一个桶进行了汇总,汇总的结果输入到桶级别数据流 bucketedStream。

BucketedCounterStream.java

window级别的数据在BucketedRollingCounterStream.java类中进行聚合,numBuckets定义了window的大小,reduceWindowToSummary为窗口求和操作。

BucketedRollingCounterStream.java

使用rxjava给hystrix带来了下面几点好处

无需再次编码

比如window中的"滚筒"操作直接可以利用rxjava的window函数并且在后台线程中运行,无需自己再编码实现

减少了线程同步

比如每条command emit的数据会发射到 thread-local级别的rx.Subject,无需再进行同步操作,


资源隔离

太空科幻题材电影永远是好莱坞最炙手可热的主题,而一部电影是否能够扣人心弦逃跑的桥段自然不能少,尤其在狭小的空间站中。《地心引力》中的女主逃离着火的国际空间站,《异行》中飞船上的伙计们逃离异行的追杀,《星际穿越》中库珀逃离旋转的空间站,似乎大家面对危险的第一反应就是“关上舱门”,把危险隔离在外。

防水仓

实际上船舱分开设计本身就是一种隔离的思想,一个防水仓进水不会导致整艘轮船沉没。如果把我们整个系统比作海上漂浮的一艘轮船,那么我们系统的各个服务就好比轮船上的各个密封舱,服务A如果强依赖于服务B那么他们就在一个舱里。

应用级别隔离

常见的应用界别隔离手段有线程池隔离,信号量隔离,连接池隔离,hystrix实现了前2种,其各自优缺点如下

线程池隔离与信号量隔离

硬件资源级别隔离

说到硬件级别的隔离就想到了近些年来大热的docker

docker

docker的sandbox特性可以让我们的应用如图中的集装箱一个个彼此分开,单个集装箱的损坏不会影响到整个服务器环境。docker为我们提供了以下几种硬件隔离方式。

docker中计算机资源隔离

docker 通过 cgroup 来控制容器使用的资源配额,包括 CPU、内存、磁盘IO三大方面

cgroup 是 Control Groups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如 cpu、memory、磁盘IO等等) 的机制,被 LXC、docker 等很多项目用于实现进程资源控制。

CPU

CPU份额控制

通过-c或者–cpu-shares参数,在创建容器时指定容器所使用的 CPU 份额值

CPU周期控制

-cpu-period、--cpu-quota两个参数控制容器可以分配到的 CPU 时钟周期

CPU核心数控制

使用–cpuset-cpu s和–cpuset-mems参数可以控制容器运行限定使用哪些 CPU 内核和内存节点

内存

-m 或 --memory:设置内存的使用限额,例如 100M, 2G。

--memory-swap:设置 内存+swap 的使用限额。

IO

block IO 权重

--blkio-weight参数可以改变容器 block IO 的优先级

限制 bps 和 iops

bps 是 byte per second,每秒读写的数据量。iops 是 io per second,每秒 IO 的次数。

--device-read-bps,限制读某个设备的 bps。

--device-write-bps,限制写某个设备的 bps。

--device-read-iops,限制读某个设备的 iops。

--device-write-iops,限制写某个设备的 iops。

docker中内核资源隔离

Linux Namespace 是 Linux 提供的一种内核级别环境隔离的方法

docker网络隔离

none 网络

host 网络

bridge 网络

User-defined 网络






资料参考:

http://reactivex.io/documentation/operators.html

https://segmentfault.com/a/1190000005988895

https://github.com/Netflix/Hystrix/wiki

https://blog.csdn.net/hustspy1990/article/details/77978329

http://blog.51cto.com/wzlinux/2046566

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容