干货收藏丨微服务架构下的9大经典隔离策略

云加社区

共 6422字,需浏览 13分钟

 ·

2024-04-12 05:06



👉目录


1 前言

2 隔离

3 动静隔离

4 读写隔离

5 核心隔离

6 热点隔离

7 用户隔离

8 进程隔离

9 线程隔离

10 集群隔离

11 机房隔离




01



前言

单体应用中,一个组件的故障往往会拖垮整个系统。而微服务架构的一个好处便在于更好的容错性——微服务之间可以实现更好的故障隔离,单个服务内的内存泄露等故障不容易影响其他服务。

但微服务架构由于服务数变多也带来了复杂度的问题,由此引来了经典的服务治理问题,这也是许多程序员走上架构师方向的必由之路。微服务中的隔离策略,便是其中的关键,本文将详解 9 大隔离策略的具体做法,为你的系统可用性添砖加瓦。



02



隔离

微服务系统中,隔离策略是流量治理的关键组成部分,其主要目的是避免单个服务的故障引发整个系统的连锁反应。

通过隔离,系统能够局部化问题,确保单个服务的问题不会影响到其他服务,从而维护整体系统的稳定性和可靠性。

常见的隔离策略:




03



动静隔离

动静隔离通常是指将系统的动态内容和静态内容分开处理

动态内容

  • 指需要实时计算或从数据库中检索的数据,通常由后端服务提供;
  • 可以通过缓存、数据库优化等方法来提高动态内容的处理速度。

静态内容

  • 指可以直接从文件系统中获取的数据,例如图片、音视频、前端的 CSS、JS 文件等静态资源;
  • 可以存储到 OSS 并通过 CDN 进行访问加速。




04



读写隔离

读写隔离通常是指将读操作和写操作分离到不同的服务或实例中处理

  • 大部分的系统里读写操作都是不均衡的,写数据可能远远少于读数据;
  • 读写隔离得以让读服务和写服务独立扩展。

DDD中有一种常用的模式:CQRS(Command Query Responsibility Segregation,命令查询职责分离)来实现读写隔离

写服务
  • 负责处理所有的写操作,例如创建、更新和删除数据;
  • 通常会有一个或多个数据库或数据存储,用于保存系统的数据。

读服务
  • 负责处理所有的读操作,例如查询和检索数据;
  • 可以有独立的数据库或数据存储,也可以使用缓存来提高查询的性能。

事件驱动
  • 当写服务处理完一个写操作后,通常会发布一个事件,通知读服务数据已经发生变化;
  • 读服务可以监听这些事件,并更新其数据库或缓存,以保证数据的一致性。

独立扩展
  • 通过 CQRS 模式,读服务和写服务可以独立地进行扩展;
  • 如果系统的读负载较高,可以增加读服务的实例数量;如果写负载较高,可以增加写服务的实例数量。




05



核心隔离

核心隔离通常是指将资源按照 “核心业务”与 “非核心业务”进行划分,优先保障“核心业务”的稳定运行AI助手

  • 核心/非核心故障域的差异隔离(机器资源、依赖资源);
  • 核心业务可以搭建多集群通过冗余资源来提升吞吐和容灾能力;
  • 按照服务的核心程度进行分级。
    • 1级:系统中最关键的服务,如果出现故障会导致用户或业务产生重大损失;
    • 2级:对于业务非常重要,如果出现故障会导致用户体验受到影响,但不会导致系统完全无法使用;
    • 3级:会对用户造成较小的影响,不容易注意或很难发现;
    • 4级:即使失败,也不会对用户体验造成影响。
    


06



热点隔离

热点隔离通常是指一种针对高频访问数据(热点数据)的隔离策略

  • 可以帮助微服务系统更高效地处理热点数据的访问请求;
  • 需要有机制来识别和监控热点数据;
    • 分析系统的历史访问记录;
    • 观察系统的监控告警信息等。
  • 将访问频次最高的 Top K 数据缓存起来,可以显著减少对后端存储服务的访问压力,同时提高数据访问的速度;
  • 可以创建一个独立的缓存服务来存储和管理热点数据,实现热点数据的隔离。



07



用户隔离

用户隔离通常是指按照不同的分组形成不同的服务实例。这样某个服务实例宕机了也只会影响对应分组的用户,而不会影响全部用户

基于 O2-SAAS 系统的租户概念,按照隔离级别的从高到低有如下几种隔离方式:

1.每个租户有独立的服务与数据库
网关根据 tenant_id 识别出对应的服务实例进行转发


2.每个租户有共享的服务与独立的数据库
用户服务根据 tenant_id 确定操作哪一个数据库


3.每个租户有共享的服务与数据库
用户服务根据 tenant_id 确定操作数据库的哪一行记录




08



进程隔离

进程隔离通常是指系统中每一个进程拥有独立的地址空间,提供操作系统级别的保护区。一个进程出现问题不会影响其他进程的正常运行,一个应用出错也不会对其他应用产生副作用

容器化部署便是进程隔离的最佳实践:




09



线程隔离

线程隔离通常是指线程池的隔离,在应用系统内部,将不同请求分类发送给不同的线程池,当某个服务出现故障时,可以根据预先设定的熔断策略阻断线程的继续执行


  • 如图,接口A 和 接口B 共用相同的线程池,当 接口A 的访问量激增时,接口C 的处理效率就会被影响,进而可能产生雪崩效应;
  • 使用线程隔离机制,可以将 接口A 和 接口B 做一个很好的隔离。 



10



集群隔离

集群隔离通常是指将某些服务单独部署成集群,或对于某些服务进行分组集群管理

具体来说就是每个服务都独立成一个系统,继续拆分模块,将功能微服务化:




11



机房隔离

机房隔离通常是指在不同的机房或数据中心部署和运行服务,实现物理层面的隔离

机房隔离的主要目的有两个:
  1. 解决数据容量大、计算和 I/O 密集度高的问题。将不同区域的用户隔离到不同的地区,比如将湖北的数据存储在湖北的服务器,浙江的数据存储在浙江的服务器,这种区域化的数据管理能有效地分散流量和系统负载;
  2. 增强数据安全性和灾难恢复能力。通过在不同地理位置建立服务的完整副本(包括计算服务和数据存储),系统可以实现异地多活或冷备份。这样,即使一个机房因自然灾害或其他紧急情况受损,其他机房仍能维持服务,确保数据安全和业务连续性。


-End-
原创作者丨孔奕凯

 


你觉得小公司几个人的团队适合微服务架构吗?为什么?欢迎评论留言。我们将选取1则优质的评论,送出腾讯Q哥公仔1个(见下图)。4月7日中午12点开奖。


📢📢欢迎加入腾讯云开发者社群,享前沿资讯、大咖干货,找兴趣搭子,交同城好友,更有鹅厂招聘机会、限量周边好礼等你来~


(长按图片立即扫码)






浏览 5
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报