4 隔离:怎么保证尊贵的VIP用户体验不受损

基础
隔离是通过资源划分,在不同服务之间建立边界,防止相互影响的一种治理措施。
一般来说,使用隔离策略主要是为了达到 3 个目的。

提升可用性,也就是说防止被影响或防止影响别人。这部分也叫做故障隔离。
提升性能,这是隔离和熔断、降级、限流不同的地方,一些隔离方案能够提高系统性能,而且有时候甚至能做到数量级提升。
提升安全性,也就是为安全性比较高的系统提供单独的集群、使用更加严苛的权限控制、迎合当地的数据合规要求等。

一般的原则是核心与核心隔离,核心与非核心隔离。
机房隔离
机房隔离也就是我们会把核心业务单独放进一个机房隔离,不会和其他不重要的服务混在一起。这个机房可能会有更加严格的变更流程、管理措施和权限控制,所以它的安全性会更高。
实例隔离
实例隔离是指某个服务独享某个实例的全部资源。
分组隔离
它通常是指一起部署的服务上有多个接口或者方法,那么就可以利用分组机制来达成隔离的效果。
连接池隔离和线程池隔离
这两种都可以看作是池子隔离,只不过一个池子里面放的是连接,另一个池子里面放的是线程。而且连接池和线程池都不必局限在微服务领域,例如数据库连接池也是同样可以做隔离的。
这两种措施针对的是同一个进程内的不同服务,一般的做法都是给核心服务单独的连接池和线程池。这么做对于性能的改进也是很有帮助的,尤其是连接池隔离。
第三方依赖隔离
第三方依赖隔离是指为核心服务或者热点专门提供数据库集群、消息队列集群等第三方依赖集群。
要弄清楚隔离机制在你们公司的应用情况,例如你可以从以下这些方面去了解。

数据库方面:你们公司有几个物理上的数据库(包括主从集群),有没有业务是独享某一个物理数据库的。
你们公司有没有准备多个 Redis 实例或者多个集群。另外理论上来说开启了持久化功能或者被用作消息队列的 Redis 最好是一个独立的集群,防止影响正常将 Redis 用作缓存的业务。
其他类似的中间件,包括消息队列、Elasticsearch 等,是否针对不同业务启用了不同的集群。
对核心业务、热点业务在资源配置上有没有什么特别之处。
在业务上,有没有针对高价值用户做什么资源倾斜。
在具体的系统上,有没有使用连接池隔离、线程池隔离等机制。
因为缺乏隔离机制引起的事故报告。

隔离最佳的面试策略是把隔离作为你构建高可用和高性能微服务的手段之一,和熔断、降级、限流合并在一起作为一个方案。
缺点:

隔离本身并不是没有代价的。一方面,隔离往往会带来资源浪费。例如为核心业务准备一个独立的 Redis 集群,它的效果确实很好,性能很好,可用性也很好。但是代价就是需要更多钱, Redis 本身需要钱,维护它也需要钱。另外一方面,隔离还容易引起资源不均衡的问题。比如说在连接池隔离里面,可能两个连接池其中一个已经满负荷了,另外一个还是非常轻松。当然,公司有钱的话就没有什么缺点了。

亮点
慢任务隔离
这个案例本质上就是线程池隔离。

之前我们遇到过一个 Bug,就是我们的定时任务总不能及时得到调度。后来我们加上监控之后,发现是因为存在少数执行很慢的任务,将线程池中的线程都占满了。所以我后来引入了线程池隔离机制,核心就是让慢任务在一个专门的线程池里面执行。 我准备了两个线程池,一个线程池专门执行慢任务,一个是执行快任务。而当任务开始执行的时候,先在快任务线程池里执行一些简单的逻辑,确定任务规模,这一步也就是为了识别慢任务。比如说根据要处理的数据量的大小,分出慢任务。如果是快任务,就继续执行。否则,转交给慢任务线程池。

这种方案的关键是如何识别慢任务。最简单的做法就是如果运行时间超过了一个阈值,那么就转交给慢任务线程池。这在识别循环处理数据里面比较好用。只需要在每次进入循环之前检测一下执行时长就可以了。而其他情况比较难,因为你没办法无侵入式地中断当前执行的代码,然后查看执行时长。

另外一种方案是根据要处理的数据量来判断。比如说任务是找到数据库里面符合条件的数据,然后逐条处理。那么可以先统计一下数据库有多少行是符合条件的。如果数据量很多,就转交给慢任务处理。

制作库与线上库分离
当创作者正在创作的时候,他们的文章、视频等内容是存放在制作库的。等到他们完成创作之后,点击发布的时候,就会保存到线上库。当然现实中从制作库到线上库的步骤并不是那么简单的。比如说内容生产平台都需要经过审核之后才能真正发布到线上库。

在我们的业务里面,采用了制作库和线上库分离的方案来保证业务的可用性和性能。大体来说,作者在 B 端写作,操作的都是制作库,这个过程 C 端读者是没有任何感知的。当作者点击发布之后,就会开始同步给审核,审核通过之后就会同步给线上库。在同步给线上库的时候,我们还会直接同步到缓存,这样作者的关注者阅读文章的时候就会直接命中缓存。

后面如果作者要修改文章,修改的也是 B 端制作库,等他修改完毕,就会再次提交审核。审核完成之前,C 端用户看到的都是历史版本,这样 B 端和 C 端隔离保证了两边的用户体验。同时拆成两个数据库之后,C 端线上库几乎都是读流量,性能很好。

内容来源于极客时间《后端工程师的高阶面经》

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容