高并发系统实战课
徐长龙
前微博架构师、极客时间架构师
11663 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 30 讲
结束语&结课测试 (2讲)
高并发系统实战课
15
15
1.0x
00:00/00:00
登录|注册

08|系统隔离:如何应对高并发流量冲击?

日志修复和消息重放
保证数据同步的难度
消息投放到分区
消息内容保存和排查问题
消息回放和顺序同步
内网服务临时离线
内网流量可控
吞吐量高且动态扩容
队列同步数据
外网业务决策库存
数据推送和自动锁定
内网网关熔断
内网网关鉴权
外网网关限流
每个项目有自己的网关和数据库
外网服务独立集群
内网服务独立集群
控制内网流量速度
保证消费顺序
Kafka分布式队列优点
队列同步数据
数据推送和自动锁定
外网和内网接口网关
控制内网流量速度
保证消费顺序
Kafka分布式队列优点
减少内网API互动
网关隔离和熔断
拆分部署和物理隔离
系统隔离性不好导致崩溃
总结
分布式队列控流和离线同步
改造方案
概述
系统隔离

该思维导图由 AI 生成,仅供参考

你好,我是徐长龙,今天我想跟你聊聊如何做好系统隔离。
我曾经在一家教育培训公司做架构师,在一次续报活动中,我们的系统出现了大规模崩溃。在活动开始有五万左右的学员同时操作,大量请求瞬间冲击我们的服务器,导致服务端有大量请求堆积,最终系统资源耗尽停止响应。我们不得不重启服务,并对接口做了限流,服务才恢复正常。
究其原因,我们习惯性地将公用的功能和数据做成了内网服务,这种方式虽然可以提高服务的复用性,但也让我们的服务非常依赖内网服务。当外网受到流量冲击时,内网也会受到放大流量的冲击,过高的流量很容易导致内网服务崩溃,进而最终导致整个网站无法响应。
事故后我们经过详细复盘,最终一致认为这次系统大规模崩溃,核心还是在于系统隔离性做得不好,业务极易相互影响。
改造前的系统部署结构
如果系统隔离性做得好,在受到大流量冲击时,只会影响被冲击的应用服务,即使某个业务因此崩溃,也不会影响到其他业务的正常运转。这就要求我们的架构要有能力隔离多个应用,并且能够隔离内外网流量,只有如此才能够保证系统的稳定。

拆分部署和物理隔离

为了提高系统的稳定性,我们决定对系统做隔离改造,具体如下图:
也就是说,每个内、外网服务都会部署在独立的集群内,同时每个项目都拥有自己的网关和数据库。而外网服务和内网必须通过网关才能访问,外网向内网同步数据是用 Kafka 来实现的。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了如何应对高并发流量冲击的系统隔离方法。作者分享了在教育培训公司系统崩溃的经历,并指出系统隔离性不足导致业务相互影响。为提高系统稳定性,作者提出了拆分部署和物理隔离、网关隔离和随时熔断、减少内网API互动等改造方案。其中,拆分部署和物理隔离通过独立集群和数据库实现内外网服务隔离;网关隔离和随时熔断则通过外网和内网网关限流和鉴权,以及外网服务断开内网网关后仍能独立运转来保证系统独立性;减少内网API互动则通过数据推送和锁定、外网业务决策库存等方式实现内外网隔离。最后,作者强调了保证数据同步单向性的重要性,并介绍了使用队列同步数据的方法。整体而言,本文通过实际案例和具体方案,深入浅出地介绍了系统隔离的重要性和实施方法,对于需要应对高并发流量冲击的技术人员具有一定的借鉴意义。文章通过介绍Kafka分布式队列的优点和数据同步的复杂性,强调了保证数据顺序性的重要性,以及如何利用Kafka实现数据同步和流量控制。同时,文章还总结了系统隔离的关键特性,包括接口网关、熔断内网接口、数据推送和消息队列投递等。这些方法和技术特点为读者提供了在实际生产过程中实践系统隔离方案的指导和思路。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《高并发系统实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(11)

  • 最新
  • 精选
  • LecKey
    外网与没网的区别: 外网是一般是针对用户端,直接对接用户使用,需要做公网解析; 内网一般是公司技术服务节点,不需要公网解析且不对外服务,都是外网服务上做单独解析才能访问内网服务,访问内网会比公网获取数据速度更快,减少了一层解析。 一般大点的公司都会做外网和内网隔离,以保障服务安全和稳定。

    作者回复: 你好,这个思考没毛病

    2022-11-09归属地:北京
    2
    3
  • dk.wu
    “不同步”是否应该调整为“没同步”? 这块可以理解为数据同步场景的一个警示牌,如何做到数据同步完整性的检测机制和补偿机制? 没同步的数据可以识别为三种情况:(1)外网服务端推送异常(2)内网服务消费异常(3)还在队列排队(4)其他。 从隔离性出发,可以独立一个审计检测服务,对比内外网已同步服务,识别到的未同步数据,可以触发重新走kafka同步。至于识别的方法,是traceId还是其他业务Id,还得看抽象通用性。

    作者回复: 不错,这里补充一句,如果是单方向的数据同步可以给数据都带上一个通用的版本号,要同步的数据如果有变更就+1这个版本号,这样很方便对比筛选。这样做通用服务可以更抽象一些

    2023-02-25归属地:广东
    1
  • Spoon
    用户在外网业务系统下单购买一个商品时,外网服务会扣减本地缓存中的库存。库存扣减成功后,外网会创建一个订单并发送创建订单消息到消息队列中 针对这段有以下疑问 1.库存扣减+订单创建应该是一个事务操作,创建订单消息并发送是在事务内还是在事务外? 2.针对问题1,如果在事务内,因为消息发完,下游收到这个消息(此时事务未提交),下游并没有查到该订单,此时的解决方案有哪些? 3.针对问题1,如果在事务外,消息发送失败怎么办(事务已经提交,怎么回滚)?

    作者回复: 同步必然会有代价的。推荐在事务外。一般来说降低发送失败概率更划算,我这采用的是落盘后扫描发送队列,最后如果发送失败,每天晚上还有脚本核对,发现差异人工分析对比。补下相关遗漏漏洞

    2023-03-29归属地:浙江
  • walle斌
    这里边的kafka换成rocketmq 没有任何问题还多了更多的特性。。

    作者回复: :)分布式队列思路都是类似的,有很多特性是雷同的,实际用起来后会发现总需要放弃一些特性

    2023-03-29归属地:北京
  • 👽
    “同时,我们在开发期间要时刻注意,内网网关在流量增大的时候要做熔断,这样可以避免外网服务强依赖内网接口,保证外网服务的独立性,确保内网不受外网流量冲击。并且外网服务要保证内网网关断开后,仍旧能正常独立运转一小时以上。” 内网断网后,仍然可访问一小时,解决方案,是把所有的操作记录缓存到外网服务内部,然后等着内网服务上线后,再推送给内网服务么?这部分细节本文没有体现,有点疑惑。

    作者回复: 你好,这里是有讲到的,主要是用队列将结果推送到内网,将数据的一些决策放到外网服务去决策

    2023-03-24归属地:广东
  • ARM
    “这个特性让我们可以做很多灵活的操作,甚至可以在流量高峰期,暂时停掉内网消费服务,待系统稳定后再开启,落地用户的交易” 那订单的状态流转会不会出问题,因为消息都在kafka没落库。比如我买东西,创建订单,我支付的时候,怎么显示已支付?退费怎么退费?

    作者回复: 你好,ARM,所有操作都在外网服务决策,内网只是同步结果

    2023-01-08归属地:北京
  • Layne
    老师,在上面说到数据指定到Kafka某个分区上,这样会出现数据倾斜问题吧,导致Kafka的集群性能出问题吧?

    作者回复: 你好,Layne,你说到了关键点,所以分区依据最好是能保证一定随机性,一般常见使用自增id或者某些比较分散的数据,如uid及订单id是snowflake算出来的,并且hash分区的算法足够发散

    2022-12-01归属地:北京
    5
  • RiseL
    外网服务要保证内网网关断开后,仍旧能正常独立运转一小时以上,数据都是内网来的,内网挂了,外网功能还怎么正常运行呢

    作者回复: 你好,risel,这就是隔离的关键,业务用数据都推送到业务内了

    2022-11-24归属地:北京
    3
  • 花花大脸猫
    可以通过给数据打tag或者版本号,然后周期性的对比同一笔数据的tag或者版本号是否一致,如果不一致,以tag或者版本号新的那一条为准

    作者回复: 你好,大脸猫,这个数据量会大一些并且全局要有tso服务才行

    2022-11-11归属地:北京
  • LecKey
    课后思考:每条数据都有唯一的数据标识(一般是自增id,或者有规律一串数字唯一id),而且一般都是小到大,根据这个最大值应该就能判断出来。 如果数据不同步应该找到对应数据节点做补偿操作

    作者回复: 你好,加深下问题:那么更新操作同一条数据如何避免

    2022-11-09归属地:北京
    5
收起评论
显示
设置
留言
11
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部