1. 隔离设计概述
- 现实生活中的隔离设计(Bulkheads 设计)
- 造船上有防漏水的隔板,一般的船无论大小都有这个东西,大一点的船回把船舱隔成若干个空间。这样如果船舱漏水,只会进到一个小空间里,不会让船舱都进水,导致整个船沉。
-
image.png
- 软件设计中
- 为了不让故障蔓延开来,需要使用隔板技术,来将架构隔成多个 船舱 来隔离故障。
- 在分布式软件架构中,一般来说分离有两种方式
- 一种是以服务的种类来做分离
- 一种是以用户来做分离。
2.系统的隔离方式
2.1 服务的种类来做分离
-
image.png
1. 微服务架构,将大系统,分离成不同的核心域。
- 不同核心域,有自己的数据库,从用户接口层,到应用层,领域层完全隔离。
- 一个核心域的故障不会影响到另一个板块。
2. 问题
- 同时获取多个核心域的数据,就需要调用多个服务,会降低性能。
- 性能底 是指响应时间,而不是吞吐量(吞吐量跟性能是反比)
- 解决方案
- 设计好用户交互,不让用户在一个页面上获取所有的数据。
- 大数据平台 ,需要把这些数据抽取到一个数据仓库计算,增加了数据合并的复杂度
- 一般用一个框架或一个中间件来对数据进行相应的抽取。
- 如果业务逻辑,跨领域,一个领域的故障也会导致流程走不下去。导致整个业务故障
- 一方面 保证这个业务流程各个子系统的高可用。
- 并且在业务流程做出 step-by-step 的方式,这样用户交互每一步都可以保存,以便故障恢复后可以继续执行。
- 如果跨领域交互变得复杂,
- 我们需要一个 Pub/Sub 的高可用,且可以持久化的消息订阅通知中间件来打通各个板块的数据和信息交互。
- 多个领域中分布式事务问题。
- 采用 两阶段,或者三阶段的模式。
2.2 按用户的请求来做分离

1. 多租户模式
- 将用户分成不同的组,并把后端的同一个服务根据这些不同组分成不同的实例。
- 让同一个服务对于不同的用户进行冗余和隔离,这样一来当服务实例挂断时,只会影响其中一部分用户,而不会导致所有用户无法访问。
- 对于大客服,可以设置独立分服务实例,或是服务集群与其他客服隔离开来,对于较小的用户,共享一个服务实例,这样可以节省相关的资源。
2. 多租户的做法
- 完全独立的设计
- 每个租户有自己完全独立的服务和数据。
- 独立的数据分区,共享的服务
- 多租户的服务是共享的, 但数据是分开隔离的。
- 共享的服务,共享的数据分区
- 每个租户的数据和服务都是共享的。
- 优缺点
-
image.png
3. 隔离设计的重点
- 定义号隔离业务的大小和粒度,过大和过小都不会,这需要认真的做业务上的需求和系统分析。
- 无论是做系统种类分离 还是多租户模式的隔离, 都需要考虑系统的复杂度,成本,性能,资源。定义好要什么和不要什么。
- 隔离模式要配置一些高可用,重试,异步,消息中间件,流控,熔断等设计模式的方法配套使用。
- 分布式系统中运维的复杂度的提升,需要很多自动化运维的工具。
- 需要一个完整的能够看得到所有服务的监控系统。
网友评论