搞定高并发系列:如何设计一个高并发系统

2023-11-12

如何设计一个高并发系统,现在这个是每个架构师都需要考虑的问题。当然每个人面对的业务场景都不一样,这里我们纯粹从技术角度探讨。我总结了下,要点如下:

  1. 负载均衡、缓存优先
  2. 服务拆分(系统拆分)、冗余扩容
  3. 削峰限流、熔断降级
  4. 分库分表、读写分离

一、负载均衡

负载均衡是首先,为接下来的系统拆分、服务拆分打下基础。统一入口,后面可以按需扩容,毕竟部署几十台服务器要比一台要强的多。服务端常用的有硬负载,比如A10、F5;有软负载,比如nginx。对于程序员来说见得负载基本都是软负载(毕竟硬负载太贵),nginx属于静态负载,不能动态扩容。后面还出了springcloud的robbin、dubbo的loadbalance等动态负载,可以动态扩容。针对纯前端也有CDN策略,可以加快静态图片、js等资源的加载速度。

nginx一般是首选,抗并发力强,稳定,插件多,还有限流、黑白名单等功能插件,会写lua脚本,nginx的性能会更强哦。

二、缓存

缓存是应对高并发访问的大杀器,毕竟访问内存比直接访问数据库要快的多,IO瓶颈得到极大解决,redis单节点轻轻松松几万并发。缓存的话现在常用的有reidis、memcached等。

按照并发量和可用性,缓存可以考虑做集群,以redis为例,部署9个节点的redis能抗住非常搞的并发量。当然用到缓存就有数据一致性问题,这也是要考虑好的问题。

三、系统拆分、冗余扩容(系统部署层面)

系统拆分是指将一个大系统拆成几个子系统,服务端分开部署,数据库也可以考虑分库,相当于在高并发场景下将巨大的流量分流。当然现在微服务很火,服务拆分和系统拆分相似。拆分的话可以考虑springcloud、dubbo等比较主流稳定的微服务框架。系统拆分后针对某几个高访问量的子系统可以多部署几台做冗余扩容,相应的并发性能也就上来了。

系统拆分或服务拆分涉及到系统的改造,也可以算是重构吧,微服务重构。重构完成后,并发量上来了,加节点就行了,可以抗的并发量可以成倍的提升。

四、削峰限流、熔断降级(服务层面)

削峰限流、熔断降级这个是我们留的后手,不得已而为之。比如某些秒杀的场景,缓存、拆分、扩容都做了,但是还是有康不多的风。这时候我们就舍小家保大家,针对流量洪峰,舍弃掉一小部分请求,保证后端服务的可用性。针对有些响应慢的服务,要及时处理掉,不然容易引起连锁反应,拖累好的服务,该下线下线,该降级降级。

削峰限流,用到的中间件当然就是mq了,kafka、RocketMQ、rabbitmq等,当然还涉及到集群的问题。熔断降级的话,dubbo有自己的实现机制,springcloud用的hystrix断路器组件。

五、分库分表、读写分离(数据库层面)

在访问到数据库前,虽然做了各种限制,但是数据库在一个高并发系统中早晚还是要抗一定的压力。考虑到访问的频率和数据本身的量级,分库分表、读写分离不可避免。

分库是指把数据库拆分为多个库,多个库来抗更高的并发;分表是指将一个表拆分为多个表,每个表的数据量保持少一点,提高sql查询性能;读写分离,比如在读多写少的情况下,主库写入,从库读取,搞一个读写分离,读流量太多的时候,还可以加更多的从库。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

搞定高并发系列:如何设计一个高并发系统 的相关文章

  • Java 语言中不可用的字节码功能

    当前 Java 6 是否有一些事情可以在 Java 字节码中完成而在 Java 语言中无法完成 我知道两者都是图灵完备的 所以将 可以做 理解为 可以做得更快 更好 或者只是以不同的方式 我正在考虑额外的字节码 例如invokedynami
  • HornetQ OutOfMemory 启动时带有大日志

    使用 HornetQ 2 0 0 CR2 独立 非集群服务器的默认配置 当我尝试使用大日志 gt 1Gb 启动服务器时 出现 OutOfMemory 异常 main 12 59 43 505 INFO org hornetq integra
  • 如何在Spring中配置@Valid上的直接字段访问?

    我怎么知道spring web无需使用 getter setter 即可验证我的 dto PostMapping path test public void test Valid RequestBody WebDTO dto public
  • 无需 Spring MVC 的定制 Spring Security

    我正在使用我自己的 MVC 实现 我不确定 Spring Security 是否不是专门为 Spring MVC 实现设计的 还可以用吗 我不清楚我应该使用 Spring Security 的哪些部分以及不需要哪些部分 我想我不需要 URL
  • Springfox - 如果不在控制器中使用 POJO,是否可以通过注释记录 POJO

    正如标题所说 如果 POJO 未在控制器方法中使用 是否可以在 swagger 文档中包含 POJO 我尝试在 POJO 类上使用 ApiModel 注释 即 ApiModel POJO public class Pojo 但是 除非 PO
  • Selenium WebDriver - 意外的模式对话框警报

    我正在尝试使用 WebDriver 来自动化网站 我正在使用 Firefox 驱动程序 但主页有一个弹出模式警报窗口 显示 您需要使用 IE 6 0 才能查看此应用程序 还有一些 功能可能无法使用 我检查了页面的来源 它有一个功能 Moda
  • C 埃及分数

    古埃及人仅使用以下形式的分数1 n因此任何其他分数都必须表示为这些单位分数的总和 而且 所有单位分数都是不同的 在C或Java中使任何分数成为埃及分数 总和越少越好 的好方法是什么 可以使用什么算法 分支定界 a 例如 3 4 1 2 1
  • java.net.SocketException:无效参数:与 BungeeCord 连接

    我编写了一个使用 gRPC 连接到服务器的 Java 依赖项 在我的 spigot 插件和普通 java 项目中使用此依赖关系工作正常 但在 BungeeCord 插件中使用它会产生以下异常 Caused by io grpc netty
  • 如何按某些属性对对象列表进行排序

    我有简单的课 public class ActiveAlarm public long timeStarted public long timeEnded private String name private String descrip
  • 将 BufferedImage 对象作为文件保存到 Amazon S3

    我目前使用以下方法将文件上传到 S3 File file new File my file path AmazonS3 s3 new AmazonS3Client new PropertiesCredentials cred s3 putO
  • 使用 Intellij Idea 和 gradle 在应用程序引擎上调试 localhost

    我正在使用 IntelliJ 社区添加并使用 Gradle 构建应用程序引擎标准环境应用程序 在迁移到 IntelliJ 和端点框架之前 我使用的是 Android Studio 我无法调试我的本地主机 我添加了 jvmFlags 如下所述
  • 带路径压缩算法的加权 Quick-Union

    有一种 带路径压缩的加权快速联合 算法 代码 public class WeightedQU private int id private int iz public WeightedQU int N id new int N iz new
  • 有没有创建 Cron 表达式的 Java 代码? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要一个 Java 代码来根据用户输入创建一个 cron 表达式 用户输入是时间 频率和执行次数 只需从评论中添加 自己创建 即可
  • Java 的支持向量机?

    我想用Java编写一个 智能监视器 它可以随时发出警报detects即将到来的性能问题 我的 Java 应用程序正在以结构化格式将数据写入日志文件
  • 什么是抽象类? [复制]

    这个问题在这里已经有答案了 当我了解抽象类时 我说 WT H 问题 创建一个无法实例化的类有什么意义呢 为什么有人想要这样的课程 什么情况下需要抽象类 如果你明白我的意思 最常见的是用作基类或接口 某些语言有单独的interface构建 有
  • Jframe 内有 2 个 Jdialogs 的 setModal 问题

    当我设置第一个选项时 我遇到了问题JDialog模态 第二个非模态 这是我正在尝试实现的功能 单击 测试对话框 按钮 一个JDialog有名字自定义对话框 主要的将会打开 如果单击 是 选项自定义对话框主 其他JDialog named 自
  • Android studio - 如何保存先前活动中选择的数据

    这是我的代码片段 这Textview充当按钮并具有Onclicklistner在他们 当cpu1000时Textview单击它会导致cpu g1000其代码如下所示的类 public class Game 1000 extends AppC
  • 在 Java 中如何找出哪个对象打开了文件?

    我需要找出答案哪个对象在我的 Java 应用程序中打开了一个文件 这是为了调试 因此欢迎使用工具或实用程序 如果发现哪个对象太具体了 这class也会很有帮助 这可能很棘手 您可以从使用分析器开始 例如VisualVM http visua
  • 如何在字段值无效的情况下更改 Struts2 验证错误消息?

    我在 Web 表单上使用 Struts2 验证 如果字段假设为整数或日期 则
  • 将人类日期(当地时间 GMT)转​​换为日期

    我正在服务器上工作 服务器正在向我发送 GMT 本地日期的日期 例如Fri Jun 22 09 29 29 NPT 2018在字符串格式上 我将其转换为日期 如下所示 SimpleDateFormat simpleDateFormat ne

随机推荐

  • jmeter之命令行模式(Non-GUI Mode )

    新浪围脖 gt o蜗牛快跑o 企鹅交流群 gt 79642549 命令行模式优势 适用于Windows和linux执行机 与os无关 命令行容易扩展 比如上集成到jenkins平台 用命令行更加容易 适用于高并发测试 测试开始时 conso
  • 中后序遍历构建二叉树与应用I

    目录 题目描述 思路分析 AC代码 题目描述 按中序遍历和后序遍历给出一棵二叉树 求这棵二叉树中叶子节点权值的最小值 输入保证叶子节点的权值各不相同 输入 测试数据有多组 对于每组测试数据 首先输入一个整数N 1 lt N lt 10000
  • 计算机视觉的延伸整理

    目录 计算机视觉 数字图像处理 模式识别 机器学习 数据挖掘 监督学习和无监督学习 强化学习 数据建模 马尔科夫决策过程 计算机视觉 计算机视觉是一门涉及数字图像处理 模式识别和机器学习等技术的交叉学科 旨在将计算机技术应用于对视觉信息的理
  • 【51单片机】LD3320A语音识别控制设计

    文章目录 一 主要功能 二 硬件资源 1 硬件准备 2 硬件连接 三 软件设计 1 软件结构 2 主要代码 四 实验现象 联系作者 一 主要功能 系统运行后 当对语音模块说出 小易小易 时 收到回复信息后 开始说出控制指令 项目中已设计 开
  • 数值计算软件有哪些?一款国产软件非常亮眼。

    数值计算软件有哪些 一款国产软件非常亮眼 数学软件由算法标准程序发展而来 大致形成于70年代初期 随着几大数学软件工程的开展 如美国的NATS工程 人们探索了产生高质量数学软件的方式 方法和技术 经过长期积累 已有丰富的 涉及广泛数学领域的
  • 2023手把手教你视频剪辑,学会后不用担心不会剪辑了,不用真人露脸!

    前段时间发布了几期有关剪辑的内容 收到不少粉丝小伙伴的留言 说自己很想做自媒体 现在遇到的最大的难题就是如何剪辑好视频作品 今天就来出这一期的基本教学 只分享今天这一次 如果感兴趣记得点赞评论和关注 有不懂的地方记得在评论区下方留言新手 我
  • 精心收集了60个C语言项目源码,分享给大家

    C语言文章更新目录 C C 学习资源 百度云盘链接 计算机二级资料 过级专用 C语言学习路线 从入门到实战 编写C语言程序的7个步骤和编程机制 C语言基础 第一个C程序 C语言基础 简单程序分析 VS2019编写简单的C程序示例 简单示例
  • node学习之express(1)

    1 前提是你安装了node npm 2 此次我学习的网站是 汇智网 3 创建一个项目学习 npm init 按照提示 输入 不输入 项目的一些信息 安装express模块 npm install express save
  • 风之幻想

    风之幻想 是我的一个练习项目 业余时间开发 用于自己的技术练习 同时也希望可以最终成为一款独立游戏 时间 2020 03 03 技能 落叶飞花完成 目前对于大量落叶的操纵还需要优化 避免一些不必要的坐标转换操作提升性能 否则效果不佳 风之幻
  • 数字电路设计之仿真时碰到的小问题

    第一点 初始化 XXX 10 i datain lt PUSH 9 b000001111 10 i datain lt SUB0 gr3 gr1 gr0 80 i datain lt SUB1 gr3 gr1 gr0 这一段中的80的延时居
  • 使用 Spring Boot 集成 Nacos

    使用 Spring Boot 集成 Nacos 在本篇博客中 我们将介绍如何使用 Spring Boot 框架来集成 Nacos 实现服务的注册与发现 Nacos 是一个开源的动态服务发现 配置和服务管理平台 能够帮助我们构建和管理微服务架
  • 在SpringBoot项目中整合SpringSession,基于Redis实现对Session的管理和事件监听

    1 SpringSession简介 SpringSession是基于Spring框架的Session管理解决方案 它基于标准的Servlet容器API 提供了Session的分布式管理解决方案 支持把Session存储在多种场景下 比如内存
  • Bert Pretrain

    预训练过程使用了Google基于Tensorflow发布的BERT源代码 首先从原始文本中创建训练数据 由于本次比赛的数据都是ID 这里重新建立了词表 并且建立了基于空格的分词器 class WhitespaceTokenizer obje
  • 从中序与后序遍历序列构造二叉树

    题目 根据一棵树的中序遍历与后序遍历构造二叉树 注意 你可以假设树中没有重复的元素 例如 给出 中序遍历 inorder 9 3 15 20 7 后序遍历 postorder 9 15 7 20 3 返回如下的二叉树 3 9 20 15 7
  • Android studio 中快捷键无效的解决方式

    Ctrl Shift f 搜狗输入法 高级 系统功能快捷键 简繁切换 修改一下就好 Ctrl Shift 左键 右键 前进后退 桌面右键 图形属性 选项和支持 快捷键修改 Ctrl Shift M Ctrl Shift N
  • Qt5.8+VS2015生成可执行文件详解

    因为写大作业 老师要求交一个可执行文件 折腾了半天 具体步骤如下 1 在vs2015中已release方式调试程序 具体如下图 执行完成之后 在我的项目中ArcBall 项目名称 x64 release文件夹下生成一个exe文件 此exe文
  • Codeforces Round 894 (Div. 3)

    A Gift Carpet 签到题 def solve n m map int input split a list input for in range n flag False 4 for j in range m for i in r
  • Python函数装饰器简介与计算程序运行时间的实现

    Python函数装饰器简介与计算程序运行时间的实现 Python中的装饰器是一种设计模式 常常被用于修饰或者增强函数的功能 它可以在不修改函数源代码的情况下 给函数附加额外的功能和属性 通常情况下 Python中的装饰器是一个带有函数参数的
  • Ubuntu c++ MySQL数据库操作

    mysql安装 sudo apt get install update sudo apt get install mysql server libmysqlclient dev mysql workbench mysql启动 重启 停止 s
  • 搞定高并发系列:如何设计一个高并发系统

    如何设计一个高并发系统 现在这个是每个架构师都需要考虑的问题 当然每个人面对的业务场景都不一样 这里我们纯粹从技术角度探讨 我总结了下 要点如下 负载均衡 缓存优先 服务拆分 系统拆分 冗余扩容 削峰限流 熔断降级 分库分表 读写分离 一