导读

日拱一卒,功不唐捐,分享是最好的学习,一个知识领域里的 “道 法 术 器” 这四个境界需要从 微观、中观以及宏观 三个角度来把握。微观是实践,中观讲套路,宏观靠领悟。本系列文章我把它命名为《分布式系统架构设计三十六式》,讲诉分布式系统里最重要的三十六个虚数的中观套路,而微服务的本质也是分布式,因此搞明白这三十六个最重要的知识点也就同时能搞明白微服务。

实现一个分布式系统通常会面临三大难题: 故障传播性、业务拆分与聚合以及分布式事务 。本系列中的服务治理章节主要是为了解决故障传播性的难题,它包括: 隔离、熔断、降级、限流、容错以及资源管控 ,本文将讲诉服务治理里的 “隔板” 模式。

动机

在分布式系统里通常将进程容器化以进行资源隔离,然后在同一个进程里的各种业务都共享线程池对外提供服务,这就经常会遇到这样的问题:

  1. 业务A负载较高,抢占了线程池里的大部分线程资源,从而造成其他业务的服务质量下降;

  2. 同一个进程内新加入一个业务,这个业务会抢占其他业务的资源,从而造成系统的不稳定,比如业务性能抖动;

  3. 难以调试,比如同一个进程里的10个业务共享同一个线程池,当出现故障时难以通过简单的日志判断是哪个业务出了问题。

因此,我们希望找出一个机制解决这样的问题。

隔板模式

首先我来看一个英文单词“Bulkhead”,翻译成中文就是“舱壁”‘或“隔板”,在分布式系统里有个资源隔离的设计模式叫做”舱壁模式”或者“隔板模式”。

模式来源: 通过万能的Wiki百科我们可以了解到轮船里的两个舱位之间的挡板就是隔板/舱壁(Bulkhead),如下图:

图片来源于引文[1],版权归原作者所有

在造船的时候,”船农们“(对应码农)通常会把一个大的船舱用隔板分成N个小的空间,以便万一船体破裂或着火的时候,只有这个被分割开的小船舱受到影响,而其他的船舱是被隔离而不受影响的,从而提高整个船只的安全度。

同样这种隔板模式可以应用在分布式系统的资源隔离设计里,在分布式系统里,资源隔离通常按业务分为进程级别的隔离和线程级别的隔离,某些简单的服务质量要求不高的业务场景下实现进程级别的隔离就够了,但是在某些对服务质量要求较高的分布式场景下需要线程级别的细粒度隔离。

进程隔离

进程级别隔离通常指的是容器化隔离,比如通过使用docker实现业务进程之间的资源隔离。

线程隔离

线程级别隔离是指给每个跑在进程里的业务都按业务类型创建一个线程池,从而实现线程级别细粒度的资源隔离,线程隔离具有以下优势:

  1. 提高业务可靠性,减少业务受其他业务影响的程度,当一个业务耗尽自身的线程资源后也不会影响另外一个业务的服务质量;

  2. 降低新加入的业务的给系统带来的风险,比如当前系统的一个进程用例中有10个业务。当新加入一个业务时,必然会抢占此前10个业务的线程资源,从而给系统带来不稳定,比如性能抖动;

  3. 利于调试,给每一个业务都分配一个线程池名称,当业务出故障时,通过线程池名称可以很方便地定位是哪个业务出了故障,并且通过监控线程池的请求失败次数、超时次数、拒绝请求次数等可以实时的反应当前业务服务质量。

事物都有二元性,线程池隔离,有利自然也有弊,线程池隔离也会引入额外的一些开销,开销类型有:

  1. 对象分配,每个调用都会实例化一个新的线程对象及其中的关联对象,占用系统资源;

  2. 并发,共享数据结构,计数器等,也占用系统资源;

  3. 线程的执行开销:切换,调度,执行,同样也占用资源。

因此,线程池的隔离带来了好处但是也会引起一些顾虑,比如给每个业务都创建一个线程池是否会给系统带来太大的开销。通过Hystrix的数据分析可以得出结论是: “开销是有的,但是对比好处,通过权衡,其开销在一些要求不苛刻的场景可以忽略。”

线程池的开销分析

Hystrix官网[3],统计了线程池带来的开销成本,如下图表示在单个API实例上以60个请求/秒执行一个HystrixCommand:

图片来源于引文[3],版权归原作者所有

通过分析这个统计图(注意不同的颜色),我们可以看到:

  1. 中位数(P50)和更低的场景下,对比不使用线程池隔离模式,隔离线程池基本没有成本开销。

  2. 在P90的场景下,对比不使用线程池隔离模式,隔离线程池的耗时差距为3毫秒。

  3. 在P99的场景下,对比不使用线程池隔离模式,隔离线程池的耗时差距为9毫秒。

但是从上图可以看出,成本增加的幅度远小于单独一个线程的执行时间增加的幅度,当未使用线程池隔离的线程执行时间从2ms跳到28ms时,线程池隔离的耗时成本从0ms跳到9ms。

因此,对于大多数的使用场景而言,在P90及以上的线程池隔离带来的开销被认为是可接受的,从而获得资源隔离带来的好处。

但是在某些场景这样的开销可能过高,比如缓存场景,在这种情况下,可以选用信号量来进行隔离,缺点是信号量不允许设置超时,难以实现熔断、降级之类的服务治理行为。

小结

本文讲诉了服务治理里的 “隔板”模式,在下一篇将讲诉分布式系统服务治理的熔断模式。另作者能力与认知都有限,欢迎大家拍砖留念。

作者简介

常平,中科大硕,10年+数据相关经验,主要工作背景为分布式系统、存储、缓存、微服务、云计算以及大数据,现就职于DELL EMC。

版权申明

本文的版权协议为 CC-BY-NC-ND license:[https://creativecommons.org/licenses/by-nc-nd/3.0/deed.zh],
在遵循署名、非商业使用(以获利为准)以及禁止演绎的前提下可以自由阅读、分享、转发、复制、分发等。

参考资料

[1] https://en.wikipedia.org/wiki/Bulkhead_(partition)

[2] http://writing.engr.psu.edu/uer/bassett.html

[3] https://github.com/Netflix/Hystrix/wiki/FAQ%20:%20General

分布式系统架构设计三十六式之服务治理 - 第一式 - 隔板模式相关推荐

  1. 推荐系统三十六式——学习笔记(三)

    由于工作需要,开始学习推荐算法,参考[极客时间]->[刑无刀大牛]的[推荐系统三十六式],学习并整理. 3 原理篇之紧邻推荐 3.1 协同过滤 要说提到推荐系统中,什么算法最名满天下,我想一定是 ...

  2. 立此存照之人生三十六式

    第一式:合作才可达成功第二式:前面永远最危险第三式:莫让他人掌生死第四式:没永远的避风港 第五式:认清自己很重要第六式:需意志时莫放弃第七式:莫受诱惑出航道第八式:凡事成功需趁早第九式:乐于沟通是潜质 ...

  3. 推荐系统三十六式(刑无刀)学习笔记(四)

    04 | 画鬼容易画人难:用户画像的"能"和"不能" 做好一个推荐系统,总共分为三步:1.认识每一个用户:2.给他推荐他感兴趣的东西:3.坐等各项指标上升. 什 ...

  4. 推荐系统三十六式(刑无刀)学习笔记(一)

    你真的需要个性化推荐系统吗? 个性化推荐已经从一个非常小众的方向,演变成了今天互联网产品的常见"配件".再加上一些以"个性化"为品牌卖点的互联网产品的成功,也给 ...

  5. 推荐系统三十六式(刑无刀)学习笔记(三)

    03 | 这些你必须应该具备的思维模式 今天主要认识两方面的内容:一个是重新认识推荐系统关键元素的重要性,另一个是要建立起两个思维模式. 对关键元素重要性的认识 要开发一个推荐系统产品,有这么四个关键 ...

  6. 分布式系统架构设计36式 – 第0式 - 设计总决

    动机 在"不易.简易.变易"这三个范畴里,技术是属于"变易"范畴的,其千变万化:"方法论"是属于"简易"范畴的,其具有领 ...

  7. 软考高级系统架构设计师系列论文三十六:论基于构件的软件开发

    软考高级系统架构设计师系列论文三十六:论基于构件的软件开发 一.摘要 二.正文 三.总结 一.摘要 本文以我主持的某商业银行交易监控分析系统项目为实例,探讨了作为开发方公司基于构件技术开发项目碰到的问 ...

  8. spring boot 与 iview 前后端分离架构之开发环境基于docker的部署的实现(三十六)

    spring boot 与 iview 前后端分离架构之开发环境基于docker的后端的部署的实现(三十六) 公众号 基于docker的后端的部署 安装mysql数据库 创建数据库 安装redis 安 ...

  9. 【大型分布式网站】抗住千万流量的大型分布式系统架构设计

    一.大型分布式网站架构技术 1.1 大型网站的特点 用户多,分布广泛 大流量,高并发 海量数据,服务高可用 安全环境恶劣,易受网络攻击 功能多,变更快,频繁发布 从小到大,渐进发展 以用户为中心 免费 ...

最新文章

  1. 转载:flash 跨域 crossdomain.xml
  2. LLLYYY的数字思维
  3. html5移动端底部效果,spring mvc +HTML5实现移动端底部上滑异步加载更多内容分页效果...
  4. 多文档版的的正则表达式工具
  5. 停车管理系统汽车到达汽车离去c语言,停车场管理系统 C语言实现
  6. np.random.get_state()
  7. 打破双亲委派机制有什么用_被打破的双亲委托机制
  8. 20 个强大的 Sublime Text 插件
  9. 大数据分析有几种方法
  10. VB之Collection---Collection集合类
  11. 用cmd 查看本机的IP地址
  12. 新能源电动汽车的充电
  13. 如何学习计算机思维,刘康平:为什么我们每个人都应该学习计算思维?
  14. 艺术创作六步法则、浅谈色彩、如何理解漫画
  15. mysql rpl_MySQL rpl_semi_sync_master_timeout相关的一件BUG
  16. 卡内基梅隆大学计算机方向,留学美国卡内基梅隆大学计算机硕士研究方向
  17. log file switch (archiving needed) 等待事件一例
  18. 家政服务:保姆朋友圈鄙视链在上海
  19. 女孩子做项目管理的发展_我可以和孩子们一起做些有趣的技术项目吗?
  20. python判断队列是否为空_python队列Queue

热门文章

  1. python画e指数函数_[宜配屋]听图阁
  2. 阿里大数据分析展示工具DataV
  3. You appear to be running an X server; please exit X before installing. For further details, please
  4. 错误:error C1853:Debug\...pch预编译头文件来自编译器版本,或者预编译头C++而在C中使用它
  5. Nike+ Fuelband SE不能激活无法连接的请看这里。
  6. 重磅来袭(90街机坦克大战unity制作)
  7. windows wss协议_Windows SharePoint Services(WSS)和SharePoint Server(MOSS)之间有什么区别...
  8. 宝塔中nginx配置websocket的wss协议
  9. Vue.js实现简单的按钮点击改变css样式
  10. 中国数字支付战况:B端业务异军突起,C端流量让位场景...