每日一博 - 三高系统架构设计:高性能、高并发、高可用性解析

文章目录

  • 引言
  • 一、高性能篇
      • 1.1 高性能的核心意义
    • 1.2 影响系统性能的因素
    • 1.3 高性能优化方法论
      • 1.3.1 读优化:缓存与数据库的结合
      • 1.3.2 写优化:异步化处理
    • 1.4 高性能优化实践
      • 1.4.1 本地缓存 vs 分布式缓存
      • 1.4.2 数据库优化
  • 二、高并发篇
    • 2.1 高并发的核心意义
    • 2.2 高并发优化方法论
      • 2.2.1 水平扩展(X轴扩展)
      • 2.2.2 纵向扩展(Y轴扩展)
      • 2.2.3 垂直扩展(Z轴扩展)
    • 2.3 高并发优化实践
      • 2.3.1 DDD实践
      • 2.3.2 热Key处理
  • 三、高可用篇
    • 3.1 高可用的核心意义
    • 3.2 高可用优化方法论
      • 3.2.1 应用层高可用
      • 3.2.2 存储层高可用
      • 3.2.3 部署层高可用
    • 3.3 高可用优化实践
      • 3.3.1 Redis高可用
      • 3.3.2 Elasticsearch高可用
      • 3.3.3 Kafka高可用
  • 四、总结

在这里插入图片描述


引言

随着用户规模的不断扩大和业务复杂性的增加,系统的性能、并发能力和可用性成为了技术团队必须面对的核心挑战。无论是C端的高流量场景,还是B端/M端的复杂业务逻辑,系统的“三高”(高性能、高并发、高可用性)设计都是确保业务稳定运行的关键。

接下来我们将深入探讨三高系统架构设计的方法论和实践, 从高性能、高并发、高可用性三个维度展开,理解如何设计和优化一个高可用、高性能、高并发的系统。


一、高性能篇

1.1 高性能的核心意义

高性能是系统设计的基石。一个高性能的系统能够快速处理请求,提供低延迟的服务,从而提升用户体验。高性能不仅直接影响系统的吞吐量,还间接决定了系统的并发能力和可用性。因此,优化系统性能是三高系统设计的首要任务。

1.2 影响系统性能的因素

系统性能的优化需要从多个维度入手,主要包括以下三个方面:

  1. 计算(Computation)

    • 系统内部的计算逻辑复杂度。
    • 频繁的Full GC(垃圾回收)会导致系统停顿,影响性能。
  2. 通信(Communication)

    • 系统与外部依赖(如数据库、缓存、第三方服务)的通信耗时。
    • 网络延迟、带宽限制等问题。
  3. 存储(Storage)

    • 数据库的读写性能,尤其是大库大表、慢SQL问题。
    • 缓存的使用效率,如Redis、Memcached等。
    • 搜索引擎(如Elasticsearch)的索引设计、分片大小等。

1.3 高性能优化方法论

在这里插入图片描述

1.3.1 读优化:缓存与数据库的结合

缓存是提升系统性能的利器,但缓存的使用需要与数据库结合,以确保数据的一致性和可靠性。根据系统的读写特点,缓存的使用可以分为以下两种场景:

  1. 读多写少的系统

    • 方案:同步更新数据库,后删除缓存。
    • 优点:以数据库为主,缓存为辅,确保数据一致性。
    • 适用场景:电商的商品详情页、新闻资讯等。
  2. 写多读少的系统

    • 方案:同步更新缓存,异步更新数据库。
    • 优点:以缓存为主,数据库为辅,提升写性能。
    • 适用场景:物流订单系统、秒杀场景等。

1.3.2 写优化:异步化处理

在高并发场景下,写操作往往成为系统的瓶颈。通过异步化处理,可以将耗时的写操作从主流程中剥离,提升系统的响应速度。

  • 秒杀场景
    • 用户下单后,系统异步处理订单,返回成功响应。
    • 通过消息队列(如Kafka、RocketMQ)削峰填谷,避免系统过载。
    • 缓存库存信息,异步扣减库存,确保数据一致性。

1.4 高性能优化实践

1.4.1 本地缓存 vs 分布式缓存

  • 本地缓存:适用于数据量小、访问频率高的场景,如Guava Cache、Caffeine。
  • 分布式缓存:适用于数据量大、需要跨节点共享的场景,如Redis、Memcached。

1.4.2 数据库优化

  • 索引优化:为高频查询字段添加索引,避免全表扫描。
  • 分库分表:将大表拆分为多个小表,提升查询性能。
  • 读写分离:主库负责写操作,从库负责读操作,分担主库压力。

二、高并发篇

2.1 高并发的核心意义

高并发是指系统能够同时处理大量请求的能力。随着用户规模的增加,系统的并发能力直接决定了其能否支撑业务的快速发展。高并发设计的目标是通过水平扩展、垂直扩展等手段,提升系统的吞吐量和响应速度。

2.2 高并发优化方法论

在这里插入图片描述

2.2.1 水平扩展(X轴扩展)

水平扩展是通过增加机器数量来提升系统的并发能力。常见的水平扩展方式包括:

  • 应用层扩展:通过负载均衡(如Nginx、HAProxy)将流量分发到多台服务器。
  • 存储层扩展:通过分库分表将数据分散到多个数据库实例。

2.2.2 纵向扩展(Y轴扩展)

纵向扩展是通过拆分单体应用为多个微服务,提升系统的可扩展性和可维护性。常见的纵向扩展方式包括:

  • 微服务架构:将系统按照业务领域拆分为多个独立的服务。
  • 领域驱动设计(DDD):通过领域划分指导微服务的设计。

2.2.3 垂直扩展(Z轴扩展)

垂直扩展是通过分片和单元化设计,提升系统的并发能力和可用性。常见的垂直扩展方式包括:

  • 分库分表:将数据按照一定规则分散到多个数据库实例。
  • 单元化设计:将系统流量和数据闭环在一个单元内,避免单点故障。

2.3 高并发优化实践

2.3.1 DDD实践

  • 业务流程:从商家下单到用户签收,涵盖正向和逆向流程。
  • 领域划分:将系统划分为商品服务域、订单域、支付结算域、履约域等。

2.3.2 热Key处理

  • 本地缓存:在应用层增加本地缓存,减少对分布式缓存的依赖。
  • 随机数法:在Key后增加随机数,将热点数据分散到多个分片。

三、高可用篇

3.1 高可用的核心意义

高可用是指系统在面对故障时仍能持续提供服务的能力。高可用设计的目标是通过冗余、容错等手段,确保系统在出现故障时能够快速恢复,避免业务中断。

3.2 高可用优化方法论

在这里插入图片描述

3.2.1 应用层高可用

  • 限流:通过限流算法(如令牌桶、漏桶)保护系统不被流量打垮。
  • 熔断降级:通过熔断器(如Hystrix)避免下游故障拖垮系统。
  • 超时设置:设置合理的超时时间,避免无限等待下游响应。
  • 重试机制:通过有限次数的重试提高请求成功率。
  • 隔离:通过线程池隔离、数据隔离等手段,控制故障影响范围。

3.2.2 存储层高可用

  • 复制:通过主从复制、多主复制等手段,确保数据的高可用。
  • 分区:通过分片将数据分散到多个节点,避免单点故障。

3.2.3 部署层高可用

  • 多机房部署:将系统部署在多个机房,避免单机房故障导致业务中断。
  • 容器化部署:通过Docker、Kubernetes等工具,实现快速扩容和故障恢复。

3.3 高可用优化实践

3.3.1 Redis高可用

  • 主从复制:主节点负责写操作,从节点负责读操作。
  • 集群模式:通过分片将数据分散到多个节点,提升并发能力。

3.3.2 Elasticsearch高可用

  • 分片与副本:通过分片和副本设计,确保数据的高可用和高性能。
  • 数据节点:将索引数据分散到多个数据节点,避免单点故障。

3.3.3 Kafka高可用

  • 分区与副本:通过分区和副本设计,提升消息队列的吞吐量和可用性。
  • Leader选举:在Leader节点故障时,自动选举新的Leader节点。

四、总结

三高系统架构设计是一场与复杂性对抗的持久战。通过高性能、高并发、高可用性的优化,我们可以构建出稳定、可靠、高效的系统,支撑业务的快速发展。

参考这里

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/962420.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FFmpeg(7.1版本)的基本组成

1. 前言 FFmpeg 是一个非常流行的开源项目,它提供了处理音频、视频以及其他多媒体内容的强大工具。FFmpeg 包含了大量的库,可以用来解码、编码、转码、处理和播放几乎所有类型的多媒体文件。它广泛用于视频和音频的录制、转换、流媒体传输等领域。 2. F…

灵芝黄金基因组注释-文献精读109

The golden genome annotation of Ganoderma lingzhi reveals a more complex scenario of eukaryotic gene structure and transcription activity 灵芝(Ganoderma lingzhi)的黄金基因组注释揭示了更复杂的真核基因结构和转录活性情况 摘要 背景 普遍…

51单片机入门_01_单片机(MCU)概述(使用STC89C52芯片;使用到的硬件及课程安排)

文章目录 1. 什么是单片机1.1 微型计算机的组成1.2 微型计算机的应用形态1.3 单板微型计算机1.4 单片机(MCU)1.4.1 单片机内部结构1.4.2 单片机应用系统的组成 1.5 80C51单片机系列1.5.1 STC公司的51单片机1.5.1 STC公司单片机的命名规则 2. 单片机的特点及应用领域2.1 单片机的…

记忆化搜索(5题)

是什么? 是一个带备忘录的递归 如何实现记忆化搜索 1.添加一个备忘录(建立一个可变参数和返回值的映射关系) 2.递归每次返回的时候把结果放到备忘录里 3.在每次进入递归的时候往备忘录里面看看。 目录 1.斐波那契数列 2.不同路径 3.最…

Redis_Redission的入门案例、多主案例搭建、分布式锁进行加锁、解锁底层源码解析

目录 ①. Redis为什么选择单线程? ②. 既然单线程这么好,为什么逐渐又加入了多线程特性? ③. redis6的多线程和IO多路复用入门篇 ④. Redis6.0默认是否开启了多线程? ⑤. REDIS多线程引入总结 ①. Redis为什么选择单线程? ①…

本地运行大模型效果及配置展示

电脑上用ollama安装了qwen2.5:32b,deepseek-r1:32b,deepseek-r1:14b,llama3.1:8b四个模型,都是Q4_K_M量化版。 运行过程中主要是cpu和内存负载比较大,qwen2.5:32b大概需要22g,deepseek-r1:32b类…

新一代搜索引擎,是 ES 的15倍?

Manticore Search介绍 Manticore Search 是一个使用 C 开发的高性能搜索引擎,创建于 2017 年,其前身是 Sphinx Search 。Manticore Search 充分利用了 Sphinx,显着改进了它的功能,修复了数百个错误,几乎完全重写了代码…

从0开始,来看看怎么去linux排查Java程序故障

一,前提准备 最基本前提:你需要有liunx环境,如果没有请参考其它文献在自己得到local建立一个虚拟机去进行测试。 有了虚拟机之后,你还需要安装jdk和配置环境变量 1. 安装JDK(以OpenJDK 17为例) 下载JDK…

MFC开发,给对话框添加垂直滚动条并解决鼠标滚动响应的问题

无论在使用QT或者MFC进行界面开发时,都会出现在一个对话框里面存在好多的选项,导致对话框变得非常长或者非常大,就会显现的不美观,在这种情况下通常是添加一个页面的滚动条来解决这个问题,下面我们就来介绍给MFC的对话…

(二)QT——按钮小程序

目录 前言 按钮小程序 1、步骤 2、代码示例 3、多个按钮 ①信号与槽的一对一 ②多对一(多个信号连接到同一个槽) ③一对多(一个信号连接到多个槽) 结论 前言 按钮小程序 Qt 按钮程序通常包含 三个核心文件: m…

QT简单实现验证码(字符)

0) 运行结果 1) 生成随机字符串 Qt主要通过QRandomGenerator类来生成随机数。在此之前的版本中,qrand()函数也常被使用,但从Qt 5.10起,推荐使用更现代化的QRandomGenerator类。 在头文件添加void generateRandomNumb…

受击反馈HitReact、死亡效果Death Dissolve、Floating伤害值Text(末尾附 客户端RPC )

受击反馈HitReact 设置角色受击标签 (GameplayTag基本了解待补充) 角色监听标签并设置移动速度 创建一个受击技能,并应用GE 实现设置角色的受击蒙太奇动画 实现角色受击时播放蒙太奇动画,为了保证通用性,将其设置为一个函数,并…

C++,STL 命名空间:理解 std 的作用、规范与陷阱

文章目录 引言一、为什么需要 std 命名空间?二、std 命名空间的组成三、使用 std 命名空间的正确姿势1. 显式作用域限定2. 谨慎使用 using 声明3. 头文件中禁止 using namespace std 四、常见陷阱与解决方案陷阱 1:与第三方库命名冲突陷阱 2:…

第11章:根据 ShuffleNet V2 迁移学习医学图像分类任务:甲状腺结节检测

目录 1. Shufflenet V2 2. 甲状腺结节检测 2.1 数据集 2.2 训练参数 2.3 训练结果 2.4 可视化网页推理 3. 下载 1. Shufflenet V2 shufflenet v2 论文中提出衡量轻量级网络的性能不能仅仅依靠FLOPs计算量,还应该多方面的考虑,例如MAC(memory acc…

【ArcGIS遇上Python】批量提取多波段影像至单个波段

本案例基于ArcGIS python,将landsat影像的7个波段影像数据,批量提取至单个波段。 相关阅读:【ArcGIS微课1000例】0141:提取多波段影像中的单个波段 文章目录 一、数据准备二、效果比对二、python批处理1. 编写python代码2. 运行代码一、数据准备 实验数据及完整的python位…

HTB:Administrator[WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用nmap对靶机…

vscode+WSL2(ubuntu22.04)+pytorch+conda+cuda+cudnn安装系列

最近在家过年闲的没事,于是研究起深度学习开发工具链的配置和安装,之前欲与天公试比高,尝试在win上用vscodecuda11.6vs2019的cl编译器搭建cuda c编程环境,最后惨败,沦为笑柄,痛定思痛,这次直接和…

亚博microros小车-原生ubuntu支持系列:17 gmapping

前置依赖 先看下亚博官网的介绍 Gmapping简介 gmapping只适用于单帧二维激光点数小于1440的点,如果单帧激光点数大于1440,那么就会出【[mapping-4] process has died】 这样的问题。 Gmapping是基于滤波SLAM框架的常用开源SLAM算法。 Gmapping基于RBp…

FreeRTOS从入门到精通 第十六章(任务通知)

参考教程:【正点原子】手把手教你学FreeRTOS实时系统_哔哩哔哩_bilibili 一、任务通知简介 1、概述 (1)任务通知顾名思义是用来通知任务的,任务控制块中的结构体成员变量ulNotifiedValue就是这个通知值。 (2&#…

数据结构选讲 (更新中)

参考 smWCDay7 数据结构选讲2 by yyc 。 可能会补充的: AT_cf17_final_j TreeMST 的 F2 Boruvka算法 目录 AT_cf17_final_j Tree MSTP5280 [ZJOI2019] 线段树 AT_cf17_final_j Tree MST link 题意 给定一棵 n n n 个点的树,点有点权 w i w_i wi​&am…