掌握系统架构,打造高性能、高可用、可伸缩技术架构(三)

阅读说明:

本文为原创文章,转发请注明出处。如果觉得文章不错,请点赞、收藏、关注一下,您的认可是我写作的动力。

技术架构目标

有了业务架构和应用架构之后,接下来是落地,首先要有硬件机器,在硬件机器上搭建系统完成业务功能,搭建系统依赖很多技术组件。后端开发常用的技术栈如下:

  • 开发语言及特性:比如java及java并发

  • 开发框架:Spring,SpringMVC, Mybatis

  • 数据库:关系型数据库Mysql, 非关系型数据库Redis, Memcache、Elasticsearch

  • 消息队列:Kafka, RocketMQ, RabbitMQ

  • 服务治理:Spring Cloud, Dubbo

  • 分布式缓存:Redis集群

  • 容器化与云原生:Docker、Kubernates

完成业务功能是技术架构最基本的需求,保证业务逻辑正确,数据准确。除此之外,还需要提供系统级功能:高可用、高性能、可伸缩。有了mysql,还又发展出了redis?消息队列解决了什么问题?面对不同场景,发展出了不同技术组件帮助我们提高系统能力。下面将对这三个功能指标进一步展开。

高可用(High Availability)

是指系统能够在出现部分故障或异常情况下,依然能够持续对外提供服务,最大限度减少服务中断时间。衡量可用性标准为:系统正常工作的时间除以总体时间,通常用几个9来表示,比如3个9表示99.9%的时间内系统可用, 4个9表示99.99%的时间内系统可用。

可用性等级 年宕机时间 月宕机时间 周宕机时间 天宕机时间
1个9(90%) 36.5天 72小时 16.8小时 2.4小时
2个9(99%) 3.65天 7.2小时 1.68小时 14.4分钟
3个9(99.9%) 8.76小时 43.8分钟 10.08分钟 1.44分钟
4个9(99.99%) 52.56分钟 4.38分钟 1.008分钟 8.64秒
5个9(99.999%) 5.26分钟 26.3秒 6.05秒 864毫秒

导致系统出现故障或者异常通常有这两种情况:

  • 软硬件故障,比如机器硬件故障、机器断电、磁盘打满、数据损坏、网络抖动、网络超时、网络断开、网卡负载满。
  • 系统自身故障,比如系统处理能力不足导致cpu飙高到100%、线程池打满、OOM。进程误杀,配置错误。

故障是不可避免的,在架构设计上可采用如下方案。

冗余与备份

系统的各个处理节点做到冗余,解决单点问题。比如同一服务异地多部署,任意一台机器故障,其他节点顶上。数据库主从架构,主节点故障切换到备用节点。进一步,切换上可优化为自动切换,相比人工切换自动切换耗时更短。

服务降级

降级是指系统将某些业务或者接口的功能降低,只提供部分或者完全停掉功能。例如,论坛可以降级为只能看帖子,不能发帖子;也可以降级为只能看帖子和评论,不能发评论。降级的核心思想就是优先保证核心业务,当然是有代价的,部分服务不可用轻点影响用户体验,严重点可导致丢失单量和用户。降级有如下方案:

限流: 对流量进行管控到系统能够正常运行时承受的范围,防止系统过载。限流方法比较多,固定窗口计数、滑动窗口计数、漏桶、令牌桶等。限流粒度可大可小,比如整体请求数、单一用户请求数,根据需要采用一个或者多个指标进行限流。

降级: 系统抛弃或者延迟执行部分不重要的功能,保障核心功能的运行。

熔断: 服务出现故障或者超时时,快速返回失败,拒绝后续请求,防止故障扩散。

监控

系统故障来源众多,不可预期,防不胜防。想要保障系统的可用性,最最重要的手段是监控。通过监控,一方面我们可以实时获取当前系统的运行状态,在出现故障征兆时,提前进行干预,避免事故;另一方面,我们可以借助监控信息,快速定位和解决问题。监控指标常用如下:

  • 基础监控:CPU, 内存、硬盘、网络;
  • Paas检查:主从延迟、消息积压;
  • 应用监控:接口整体成功率、接口整体耗时、JVM、异常日志;
  • 业务监控:下单量、请求量、支付成功率等。

当然还有很多可以做,比如隔离(线程池隔离、功能拆解隔离),服务治理(区分核心接口、弱依赖、容量评估、超时配置)、捕获异常等。采用柔性事务保障数据最终一致性以及数据对账。发布流程上自动化比对测试、分批发布。

高性能(High Performance)

高性能是指能够以低延迟(Latency)、高吞吐量(Throughput) 和高并发(Concurrency) 处理请求,同时保持资源的合理利用率。其核心目标是最大化单位时间内的有效处理能力,同时最小化响应时间和资源浪费。高性能衡量指标如下:

  • 吞吐量:单位时间内系统能处理的请求数量(如 QPS、TPS)。
  • 并发量:系统同时处理多个请求的能力。
  • 延迟:单个请求从发出到收到响应的时间。
  • 资源利用率:CPU、内存、I/O、网络等资源的有效使用率。

高性能可采用如下方案。

加快单个请求处理

加快系统处理单次请求,缩短单次请求的处理时间,提升系统单位时间内请求处理量。常用方案如下:

  • 缓存:数据存储介质有机械磁盘、SSD磁盘、内存。这几个介质获取和写入数据性能对比如下:机械磁盘 << SSD磁盘 < 内存。缓存数据保存在内存中,使用缓存可大大提高系统的性能。常用的缓存技术有redis,可构建分布式集群或者单机,以及guava构建进程级别缓存。
缓存架构
  • 数据库读写分离和添加索引:数据库读写分离,降低单机压力,提高单机吞吐量;采用合理索引,降低数据库检索时间。
  • 请求并行:把一个请求分解为多个子请求,无依赖关系的子请求并行处理,最后合并结果。举个简单泡茶例子,前期准备工作洗茶壶,洗茶杯, 烧开水可并行处理,都准备妥当了之后再进行泡茶。

并行处理

一个人干不完,那就10个人一起来干。使用多个节点或者多线程技术来处理请求,从而提升系统单位时间内处理请求的数量。

请求异步化

处理核心业务时,把相对不核心的逻辑做异步化处理。比如下单时,系统实时进行扣库存、生成订单等操作,而非核心的下单送积分、下单成功发消息等操作,我们就可以做异步处理,这样就能够提升下单接口的性能。实现方式有很多,比较可靠的是消息队列,数据库 + 定时任务轮询。

另外一种异步化比较极端的例子是将请求暂存,后台再慢慢处理。对于不要求实时返回的请求并且请求流量高峰期很短时,可延长系统的处理时间,在一个相对合理的时间内,系统能够处理完就行。比如热门商品秒杀以及抢政府消费券场景,暂存介质选择redis队列,redis队列结构读写性能好,并且可获取队列长度。

可伸缩(Scalability)

可伸缩性是指系统、网络或流程在应对增长(如数据量增加、用户量增长或交易量上升)时,能够通过扩展资源来保持或提高性能的能力;在下降时,能够快速减少系统资源,降低系统成本。系统的业务量在不同的时间点,有高峰有低谷,比如餐饮行业有午高峰和晚高峰,还有电商的大促场景。

可伸缩有垂直扩展和水平扩展两种方案。垂直扩展通过增加单个节点的资源(CPU、内存、存储)来提高性能。水平扩展通过增加更多节点来分散负载。水平扩展在成本和灵活性上都更有优势,企业中一般也是采用水平扩展。

对于有状态节点比如数据库采用分库分表、一主多从完成改造,消息中间件添加队列和消费者。对于无状态节点,直接增删节点就可以了,甚至将多个关联服务节点打包成一个单元,以单元粒度进行整体伸缩,提高伸缩操作性。

云原生技术,发展出一套完整的方法论和技术栈来实现系统的高效扩展。docker将服务进行容器化实现快速部署,Kubernetes等工具可自动扩展/收缩容器实例数量。

总结

本文总结技术架构常用技术栈,并对如何如何实现高可用、高性能、可伸缩目标进行展开并且提供了解决方案。高可用的架构原则有冗余无单点、服务降级、监控等;高性能架构原则有缓存、异步化、并行等。在项目中,灵活应用这些原则。

参考

time.geekbang.org/column/intr...

相关推荐
我最厉害。,。1 小时前
接口安全&SOAP&OpenAPI&RESTful&分类特征导入&项目联动检测
后端·restful
AI大模型系统化学习3 小时前
AI产品风向标:从「工具属性」到「认知引擎」的架构跃迁
大数据·人工智能·ai·架构·大模型·ai大模型·大模型学习
stormsha3 小时前
MCP架构全解析:从核心原理到企业级实践
服务器·c++·架构
10000hours3 小时前
【存储基础】NUMA架构
java·开发语言·架构
AntBlack3 小时前
计算机视觉 : 端午无事 ,图像处理入门案例一文速通
后端·python·计算机视觉
福大大架构师每日一题5 小时前
2025-06-02:最小可整除数位乘积Ⅱ。用go语言,给定一个表示正整数的字符串 num 和一个整数 t。 定义:如果一个整数的每一位都不是 0,则称该整数为
后端
Code_Artist5 小时前
[Mybatis] 因 0 != null and 0 != '' 酿成的事故,害得我又过点啦!
java·后端·mybatis
程序员博博5 小时前
看到这种代码,我直接气到想打人
后端
南雨北斗5 小时前
php 图片压缩函数
后端
L2ncE5 小时前
ES101系列08 | 数据建模和索引重建
java·后端·elasticsearch