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

阅读说明:

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

技术架构目标

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

  • 开发语言及特性:比如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...

相关推荐
止语Lab42 分钟前
好的 DX 不等于少写代码——三种语言的摩擦力设计课
后端
吃饱了得干活42 分钟前
别再手动解析 LLM 输出了!LangChain 四种结构化输出方案对比
后端·python·langchain
程序员天天困1 小时前
Arthas trace 命令怎么用?一行定位最慢那行代码
jvm·后端
Huiturn1 小时前
GPT 5.6 连续编码 10 小时,纯 Python 啃下 Word 二进制格式——doc2docx 实现拆解
后端
AI小白Lin1 小时前
33 个 AI 专家全票通过?那问题才刚开始
人工智能·架构
用户298698530141 小时前
Python 实现 Excel 与 Markdown 互转的实用指南
后端·python·excel
用户77283104908401 小时前
krono-job:零侵入、单二进制交付的分布式任务调度平台(开源)
后端
Conan在掘金1 小时前
鸿蒙报错速查:Function lacks ending return statement,返回路径漏 return 就炸,根因 + 真解法
后端
人间凡尔赛1 小时前
AI-Native 云原生架构:2026 年从容器编排到智能体编排的范式革命
后端·云原生·架构