看懂架构设计中的服务隔离
前言
我们在做系统架构设计的时候,经常离不开的一个话题就是进行服务的隔离设计。
那什么是「服务隔离」呢?
顾名思义,它是指将系统按照一定的原则划分为若干个服务模块,各个模块之间相对独立,无强依赖。当有故障发生时,能将问题和影响隔离在某个模块内部,而不扩散风险,不波及其它模块,不影响整体的系统服务。
其实隔离设计并非软件行业独创,它是借鉴于造船行业。
行业有一个专业术语叫做「舱壁隔离」。利用舱壁将不同的船舱隔离起来,如果某一个船舱进了水,那么就可以立即封闭舱门,形成舱壁隔离,只损失那一个船舱,其他船舱不受影响,整个船只还是可以正常航行。
一、为什么要做服务隔离设计呢?
我们在做系统设计的时候,必须有一个清楚的认知是:任何软件系统,故障是不可避免的,并且大多数还是不可预测的,因此,我们只能在系统的设计之初就充分的考虑好应对措施,如何在故障发生时,去尽最大可能的止损和减少故障范围。
没有人敢说他的系统是百分百可用,我们能做的就是,使用一切方法去减少故障的影响面,尽可能的去提高系统的整体可用率。
而把系统分离成子服务,将子服务进行一定程度隔离的做法,能保证在有不可预测的故障发生时,缩小故障范围的最佳手段。
二、服务隔离应该怎么做?
那在实际项目中,一般通过什么方法去做服务隔离呢?主要有以下两种:
按服务/功能做隔离
按用户分类隔离
首先说一下按照服务进行隔离的做法。
网上找了一张图,虽然原图的作用不是用来表述这个的,但是也类似,将就看吧。
比如上图里面,微博项目可以把 Feed信息流、用户系统、评论系统 都分拆为独立业务模块,这些模块无论是对外的接口应用、还是到数据库、到底层硬件资源都是完全隔离的。其中任何一个模块的故障,理论上都不会影响到其它模块。
再举个例子,如果我们要设计个电商平台,可以将其中的 用户系统、订单系统、支付系统、仓储系统 都分别进行独立隔离,这样做就是从服务层面实现了故障的隔离效果。
那按照服务隔离有没有弊端呢?有,肯定有。
当我们某个功能操作需要关联多个服务模块或者同时查询所个模块数据的时候,代码写起来就会相对麻烦一些了,其中涉及到多模块调用的性能问题、数据一致性问题、事物问题等。
不同服务模块之间的交互也会比较复杂一些,因为要做服务隔离,避免服务强依赖,所以模块之间的交互调用最好是走异步模式,需要通过异步线程或消息中间件来传递实现。
在进行运营大数据分析的时候,由于数据是散落在不同服务模块的,因此需要做额外的汇聚操作,还得有唯一字段保证数据在不同模块产生的先后顺序。
接下来说一下按用户隔离的做法
继续网上找图,虽然原图的作用不是用来表述这个的,但是也类似。粉丝又不多,我又懒得画图,将就看吧,多发挥一下想象力,哈哈。
简单一句话解释就是:我们先部署多套一模一样的业务服务,然后将用户根据一定的特征去做分类,让不同分类的用户去访问不同的业务实例,达到分流和隔离的效果。
怎么给用户分类?
可以用按照用户是否VIP、用户等级、用户IP等等,方法很多,要结合自己实际业务的特性来做。
其实这也是一种「多租户架构」,在SaaS服务中用得比较多。
多租户模式有三种形式:
完全的隔离,即服务和数据都是完全独立的。
公共服务、独立数据源,即多个租户是用的同一台服务程序,但是底层的数据源是独立的。
公用服务、公用数据源,即多个租户的服务程序与数据库源都是共享的,不同数据可能会做分区分表来独立。
上述三种方式,从下到上,独立性和安全性越来越高,资源利用率越来越低,根据业务特性去选择,一般选择折中方案。
另外,功能隔离和用户隔离 两种方式并非互斥的,是可以结合在一起使用的。
三、服务隔离的注意事项
我们在做服务隔离的时候,还是有一些原则和事项需要注意的:
不可越界:能在隔离模块内完成的逻辑,就尽量不要跨模块调用,减少依赖。
不可共享:数据和资源能独享的就尽量不要共享,不然很容易造成隔离失效。
考虑效率:设计隔离模块的时候,要根据业务情况而定,充分的考虑到未来的拓补结构,减少调用效率的损失。
考虑颗粒度:隔离模块设计的大小问题,过大和过小都不合适,需充分考虑。
服务的全面监控:既然服务或用户进行隔离了,那么系统的复杂度肯定是比之前要高了,那么针对多服务的全链路监控是必不可少的。
服务隔离的设计模式能降低依赖服务对整个系统的影响,保护有限的资源不被耗尽,提高了整个系统的可用性。本文参考了很多其它资料,属于抛砖引玉,希望大家能一起交流,提出更好的架构设计思路。
欢迎工作一到五年的Java工程师朋友们加入Java爬坑之路:860113481
群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!
转载于:https://blog.51cto.com/13732225/2172933
看懂架构设计中的服务隔离相关推荐
- 敏捷思维- 架构设计中的方法学
敏捷思维-架构设计中的方法学 目录 1.从方法论看架构设计... 2 2.架构设计的敏捷视图... 7 3.源自需求... 13 4.团队设计... 18 5.简单设计... 24 6.迭代设计... ...
- 敏捷思维-架构设计中的方法学
敏捷思维-架构设计中的方法学 1. 从方法论看架构设计 1. 架构设计的敏捷视图 2. 源自需求 3. 团队设计 4. 简单设计 5. 迭代设计 6. 组合使 ...
- 架构设计之「服务限流」
架构设计之「服务限流」 原文:架构设计之「服务限流」 上一篇我们聊过了架构设计中的「服务隔离」模式,今天我们继续来探索一下在分布式系统架构中的另一个常用的设计:服务限流. 那么,什么是「服务限流」呢? ...
- re.containerbase.startinternal 子容器启动失败_微服务架构:基于微服务和Docker容器技术的PaaS云平台架构设计(微服务架构实施原理)...
走过路过不要错过 点击蓝字关注我们 基于微服务架构和Docker容器技术的PaaS云平台建设目标是给我们的开发人员提供一套服务快速开发.部署.运维管理.持续开发持续集成的流程.平台提供基础设施.中间件 ...
- 架构设计中的方法学(五)
在定义了架构愿景之后,团队中的所有人员应该对待开发的软件有一定的了解了.但是,面对一个庞大的软件系统,接下来要做些什么呢?分而治之的思想是计算机领域非常重要的思想,因此我们也从这里开始入手. 要进行应 ...
- 中台之上(三):战略和组织结构,业务架构设计中不应被忽视的关键因素
业务架构的起点:解读企业战略 \n 业务架构最大的特点就是要从企业整体视角出发思考问题,要有居高临下的俯视视角,时刻有一张企业整体的业务能力地图印在脑子里,而企业的业务能力是服务于业务目标的,业务目标 ...
- 万剑归宗—架构设计中的抽象思维与具象思维
新项目上线,用户量不断增加,工作中继续不断发现问题,解决问题.花一点时间来总结一下自己对架构设计的理解. 小小的打个广告.这篇文章是发布在neil的微信公众号上.neil的文章都会第一时间发布在微信公 ...
- 汽车电子电气架构设计中的控制器融合分析
本文由叶日良,姜立标联合创作 摘要 随着汽车智能化.网联化的发展,整车电器功能愈加丰富,对电子电气架构的设计提出了更高的要求.文章综述了汽车电子电气架构的开发流程和发展趋势,并为架构设计中的控制器融合 ...
- 挖财首席架构师王福强:架构设计中的6大关键点
摘要:架构设计的重要性不言而喻,挖财首席架构师王福强日前在一个技术沙龙中分享了挖财架构设计中的6大关键点:系统层级分离:消息传递:异步化处理:信息存储,宁多勿缺:系统安全:存储冗余. 编者按:要开发出 ...
最新文章
- datetime类型需要指定长度吗_你真的用对数据库了吗?
- 字符集详解 ------------------------ UNICODE +UTF8
- 项目中SQL语句文件保存及提取方法
- Android之如何判断当前是阿拉伯布局的方法
- 高等数学下-赵立军-北京大学出版社-题解-练习10.5
- 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 4丨员工薪水中位数【难度困难】
- Keepalive工作原理
- 华为云PB级数据库GaussDB(for Redis)揭秘第九期:与HBase的对比
- Spring自动装配(autowire)篇
- 锂电池保护板原理(转)
- 仪器采集信号后用matlab分析,基于MATLAB的语音信号采集和分析系统的可视化设计...
- win10远程桌面查看对方计算机名,教你如何使用Win10远程桌面控制他人电脑?
- 一款可以通过经度纬度精确查询天气的工具
- 2019 11月 月末总结
- c语言程序烧写步骤,单片机烧写程序步骤
- matlab不连续分段函数,分段函数画出的曲面不连续如何办?
- final 修饰的成员变量必须手动初始化
- 23.文件特殊权限之SUID权限、SGID权限、Sticky BIT权限和ACL权限
- 百度贴吧BDUSS获取器
- 第五讲 Virtual Box 安装(2)
热门文章
- 计算机软件复用意义何在,2009计算机科学技术导论复习要点.pdf
- java 项目 人力资源项目,基于jsp的人力资源系统-JavaEE实现人力资源系统 - java项目源码...
- python制作加密工具_Python制作钉钉加密/解密工具
- router vue 动态改变url_2020年 vue常见面试问题总结(干货)!
- dao层如何调用对象_你的项目应该如何正确分层?
- python微信集成_Python微信公众号后台开发005:集成智能聊天机器人​
- html5 css 三角形,css怎么画三角形?
- 45道mysql数据库题目_MySQL 45道练习题
- android arm 寄存器,ARM汇编
- oracle olap报告,10g部署oracle olap组件