后端工程师的高阶面经
邓明
前 Shopee 高级工程师,Beego PMC
6888 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 50 讲
后端工程师的高阶面经
15
15
1.0x
00:00/00:00
登录|注册

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

你好,我是大明。今天我们来聊一聊微服务架构下的隔离功能。
隔离和前面讨论的熔断、降级、限流比起来,在面试中要“冷”一点。一个很重要的原因是隔离在实际中的应用要比限流这种措施少很多。尤其是在中小型公司,很多时候是用不到隔离的。但隔离依旧是构建高可用和高性能的微服务架构中的一环,因为在出现故障的时候,隔离可以把影响限制在一个可以忍受的范围内。
比如说我们为 VIP 用户提供单独的服务集群,普通用户共享一个服务集群。那么普通用户集群出了问题,VIP 用户一点感觉都没有,依旧可以正常使用,这样就可以保证 VIP 用户体验不受损。特别是复杂的、核心的和规模庞大的服务,隔离机制就更加重要了。否则,一个小小的故障都能蔓延到整个系统,你就离喜提大礼包不远了。
所以今天我就带你看看隔离在实际工作中形形色色的用法以及两个比较出彩的隔离方案。

前置知识

隔离是通过资源划分,在不同服务之间建立边界,防止相互影响的一种治理措施。
隔离在实际工作中有很多种做法,从不同的角度可以进行不同类型的隔离。一般来说,使用隔离策略主要是为了达到 3 个目的。
提升可用性,也就是说防止被影响或防止影响别人。这部分也叫做故障隔离。
提升性能,这是隔离和熔断、降级、限流不同的地方,一些隔离方案能够提高系统性能,而且有时候甚至能做到数量级提升。
提升安全性,也就是为安全性比较高的系统提供单独的集群、使用更加严苛的权限控制、迎合当地的数据合规要求等。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了微服务架构下的隔离功能对于保证VIP用户体验至关重要。隔离通过资源划分,在不同服务之间建立边界,以防止相互影响,提升可用性、性能和安全性。文章提到了几种隔离策略,包括机房隔离、实例隔离、分组隔离、连接池隔离和线程池隔离,以及第三方依赖隔离。隔离的实际应用对于构建高可用和高性能的微服务架构至关重要,尤其对于复杂、核心和规模庞大的服务。读者可以从中快速了解隔离在微服务架构中的重要性和多种实际应用场景,为构建稳定可靠的系统提供了有益的参考。同时,文章还提供了面试准备的建议,包括如何在面试中展示对隔离的理解和应用,以及如何将隔离作为构建高可用和高性能微服务的手段之一。文章还强调了隔离的缺点,如资源浪费和不均衡问题,以及亮点方案,如慢任务隔离和制作库与线上库分离。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《后端工程师的高阶面经》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(7)

  • 最新
  • 精选
  • 3.0的A7
    一,刚开始觉得可以(主要是想着参考数据的冷热分离),但是写着写着觉得不太行,原因有以下几个:1、热点数据应该是比较重要的数据,如果出了问题,舆论影响会比较大。2、热点数据可以通过负载策略打到权重高的机器。3、热点数据只是说查询频繁,不是大请求,所以按照冷热分离解决不了本质的问题。 二、我是写 java 的,主要用到就是 springboot 这一套,见识短浅,没听过池隔离呀,尤其是文中说的那个快慢任务线程,不知道怎么实现,如果老师能给出常用后端语言的代码示例就更棒了

    作者回复: 1. 赞!对于特定一个热点业务,其实应该要做的尽量将流量分散开来,不然的话热点高并发可能打崩机器。也就是,不同业务的热点之间要隔离,同一个业务热点就不要隔离,并且应该尽量让热点分散到所有的机器上。 2. 你写 Java 应该很经常遇到,比如说用 @Async 注解。另外就是你使用的 ORM,RPC 框架的,你去看看是否有提供配置,能让你指定专门的线程池。比如说在 Dubbo 里面就有的。

    2023-06-28归属地:北京
    2
    6
  • Johar
    1.热点数据不能集中放,因为热点数据一般的请求量很大,需要将热点数据均衡分配各个节点,降低热点数据造成的压力 2.我们是用的是spring cloud,在对接新服务并且是核心业务的时候会使用线程池隔离,原因:新服务一般稳定性差,不能影响核心业务。当然用的多了,到处都是线程池,增加线程切换和内存的消耗

    作者回复: 2. 这时候,如果我是面试官我就会追问你,那么多线程池你怎么管?也就是你提到的,到处都是线程池有什么问题?怎么解决问题? 比如说我们之前就出过一个问题。也就是我们一个庞大的服务,每一个开发都觉得自己的业务很核心,然后就开了一个独立的线程池。本来每个人都开是没什么问题的,但是大家都开加一起就出问题了。 不过当时我们也没很好的办法。一个是将这个庞大的服务拆分了;另外一个是梳理了一下,对服务进行了分级,分成了三级:独享,部分共享,全服务无共享三种线程池。这样控制住了线程池数量和线程数量。 其实,后面在讲超时控制的内容也可以用于缓解这个问题。就是设置好超时时间,那么线程池的线程会及时释放,变相地就可以少用一些线程,也能缓解系统线程数量过多的问题。 彻底解决,还是依赖于当时我们直接拆分,一次拆出来三个核心服务,各自独立部署。

    2023-06-28归属地:重庆
    5
  • Geek_c88cae
    明哥您好,我是C++程序员,我想请问下线程池隔离: 1. 线程池中的线程数怎么确定?通常来说是大于等于内核线程数的,既然如此,只要创建的用户线程数大于内核线程数,其底层都是所有的内核线程执行,那么其“大于”的意义在哪,为什么不“等于”呢? 2. 如果快慢线程池都是在一台服务器上,其对应的内核线程数是恒定的,怎么做到隔离的效果呢,将线程与CPU核心绑定吗?但是我从没见过线程池绑定CPU的呀^_^?

    作者回复: 1. 其实线程池中的线程数和你的内核线程、用户线程模型没太大关系。线程数的确定要考虑你的业务会不会频繁引起阻塞。正常来说,线程池会有核心线程数、最大线程数、空闲线程数。核心线程数比 CPU 大 1 就可以,而空闲线程数就看你能给它多少资源了。 2. 不是,意思是你慢线程你就慢慢处理任务,但是那些快的任务,短的任务在另外一个线程池上,就不会受到影响。这种隔离确实不彻底,毕竟大家都还在共享 CPU。要彻底隔离,就得另外启动一个虚拟机,把快慢任务彻底分离。

    2023-07-25归属地:北京
    2
    1
  • Lum
    给老师个建议,文字太多,显得干巴巴,可以搞点伪代码看看思路

    作者回复: 感谢你的建议啊,后面讲解思路的时候可以用伪代码配合,但是文字怕是少不了,因为要用一种针对面试的口语化的表述清楚原理。 毕竟在面试的时候总不能说面试官我给你来一个伪代码=。=

    2023-07-07归属地:北京
    1
  • peter
    请教老师几个问题: Q1:Redis会被用作消息队列吗? 文中“或者被用作消息队列的 Redis 最好是一个独立的集群”,消息队列有四个常见的产品,很少听说过Redis作为消息队列。 Q2:分组一般怎么做的? 在网关或Nginx给请求加一个分组标志位吗? Q3:SpringCloud支持连接池隔离吗? Q4:一台机器上,MySQL适合起多个实例吗? 还是说一台机器上只适合起一个MySQL实例?

    作者回复: 1. Redis 在一些中小公司里面确实会被用作消息队列,比如说使用 Redis 的订阅功能。 2. 分组这个要讨论请求和实力分开来看。对于请求来说,可以是你任何一个上游打个标记,比如你说的网关,或者前端自己在 Header 里面带一个标记位。也可以是你自己计算一下,比如说对于一个用户是不是 VIP 这种,在登录校验那里或者权限校验那里,你就可以在上下文里面打一个标签。这个标签,是需要能够跨端传递的。而至于说某些实例属于哪些组,一种是服务端自己配置文件(或者环境变量)里面指定,而后注册到注册中心;也可以是动态计算,比如说服务端自己计算自己的当下状态,如果发现自己负载高了,也可以自己给自己打一个标签“高负载”。 3. 支持的,这个你需要去看看 SpringCloud 的文档 4. 正常来说,我是建议一台机器就启动一个实例的,让它独占资源,性能最好,出问题了影响也最小,同时也不会被别人影响。不过要是物理机虚拟出来了虚拟机,那么每个虚拟机一个也可以,因为资源从逻辑上也隔离了,你启多个容器也可以。目前在大公司里面的 MySQL 有些都是容器化部署的,那么一台物理机上可能就有非常多个 MySQL。

    2023-06-28归属地:北京
    1
  • Geek_7b342f
    vip用户和普通用户,怎么识别呢,在哪一个阶段识别呢

    作者回复: 正常你可以在用户登录的时候在 session 里面加入一个 vip 的标记位。然后在登录校验里面,检查一下是不是 vip。如果是 vip,就在整个链路中传递 vip=true 这个标记位。

    2023-11-22归属地:广东
  • Geek_680632
    1.这里的问题在于如何识别热点数据,以及如何设计相应的路由机制,在读写时找到对应的资源并进行操作,对于区分明显的场景可行;2.例如mysql是不支持线程池隔离的。

    作者回复: 2. 不过一些语言的 mysql 的 driver,或者连接池是支持隔离的。比如说 JAVA 里面一大堆的 mysql 连接池实现,可以随便折腾。

    2023-10-17归属地:浙江
收起评论
显示
设置
留言
7
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部