微服务分布式系统熔断实战

熔断在分布式系统的作用已经被强调过很多次了

可以通过这篇文章来了解价值,Netflix在自己的分布式系统中应用熔断技术来保护系统

http://blog.51cto.com/developerycj/1950881

内部的实现机制可以参考

https://martinfowler.com/bliki/CircuitBreaker.html

本篇文章将介绍go chassis如何通过熔断机制,隔离上游服务,保护下游服务。

Go chassis如何保证上游错误不影响下游系统

go chassis引用并包装了https://github.com/afex/hystrix-go带来了熔断和降级功能。

当运行时内部处理中的协程达到一定阈值,错误率达到一定阈值,或者超时达到一定阈值时,就会触发熔断,用户可按需定制调教熔断器配置项设定这些参数。

hystrix-go内部的熔断逻辑

go chassis使用统一的invocation抽象来代表每一次远程调用,hystrix-go使用command抽象来封装任何一个执行片段,invocation会被强制封装到command中,并在一个circuit中执行。

每个Circuit都是唯一的Name,并且有一个Ticket桶,用来存放ticket,一开始它是关闭状态,即一切运转正常

调用将被强制性的包装进入circuit独立协程池中,并领取一个ticket。

command最终只有2种状态,超时,或者完成。每当达到这两个状态就会归还ticket

在这里可以看到ticket机制其实跟限流中的令牌桶算法很像。

当超时或者拿不到ticket时就会被记为一次错误,当错误达到一定阈值,circuit就会打开,拒绝发送网络请求

服务级别隔离

每个service内部会有多个circuit,每个circuit对应一个上游微服务。当service3出现问题时(如死锁,或是并发量太大),将物理进行隔绝,即不再发送任何请求,以保证系统健康,service1依然可以正常和2,4交互,保证大部分业务正常。

这么来看还是很理想的,serivce3的错误调用不至于拖垮service1(如果死锁了,很容易就拖垮service1,导致这个由四个服务组成的系统瘫痪),但真的如此么,让我们看看层级复杂些的系统。

为何服务级别隔离还不够?

每个服务都是基于go chassis开发的

假设api2需要调用service4完成,api1调用3完成,api3调用5完成

service4内的死锁导致api2失败了,最终触发熔断。service1将整个service2全部隔离了,导致一个小小的死锁,引发了系统快速失败。

看上去熔断在这里反而起到了坏的效果,那让我们看看没熔断会发生什么

不加入熔断

这时就看哪个客户端做了超时处理了,因为死锁的存在,会导致整条调用链路挂死,最终导致客户端端口耗尽后,进而快速失败

现在来看,死锁在一个不健壮的系统中是一定会拖垮整个分布式系统的,无解

有熔断和没熔断效果都一样,最终都是快速失败。那么如何解决

API级别熔断

每个circuit只负责一个API的执行,监控,隔离

当service2调用service4时,单独的接口进入到隔离状态而不影响其他API调用。

总结

通过这篇文章我们知道了服务级别的错误隔离是不够的,结构不复杂的系统尚可接受,但是复杂后不能因为一个API的错误而隔离整个服务,而是细粒度的进行隔离。go chassis提供了API级别熔断帮助开发者快速隔离问题服务。

熔断的手段有超时实践,并发数,错误率等。它强制性的保护起每一次远程调用,无需开发者自己编写代码处理超时,死锁,网络错误等问题,解放了开发者,让他们更多的去关注业务代码而不是分布式系统带来的复杂性

项目资料

go chassis开发框架:https://github.com/go-chassis/go-chassis

熔断文档:https://go-chassis.readthedocs.io/en/latest/user-guides/cb-and-fallback.html

go chassis系列文章: 

https://www.jianshu.com/p/50a0908b81a1

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

推荐阅读更多精彩内容