高并发架构设计

2023-10-27

通过本文你将了解:

  • 高并发架构概述
  • 高并发度量指标
  • 高并发架构设计思路
  • 高并发方案:池化技术
  • 高并发方案:缓存
  • 高并发方案:消息系列
  • 高并发方案:限流
  • 数据库高并发方案

01 概述

高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求。

高并发一方面可以提高资源利用率,加快系统响应速度,但是同时也会带来安全性,分布式事务、死锁等问题。

并发:一个处理器同时处理多个任务。

并行:多个处理器或者是多核的处理器同时处理多个不同的任务。

02 度量指标

并发的指标一般有QPS,TPS,IOPS,并发用户数,PV,响应时间等。

2.1 QPS

QPS:每秒响应请求数,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准, 即每秒的响应请求数,也即是最大吞吐能力。

2.2 TPS

Transactions Per Second,也就是事务数/秒。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数。

QPS基本类似于TPS,但是不同的是,对于一个页面的一次访问,形成一个TPS;但一次页面请求,可能产生多次对服务器的请求,服务器对这些请求,就可计入“QPS”之中。

2.3 并发用户数

并发用户数:同时承载正常使用系统功能的用户数量。例如一个即时通讯系统,同时在线量一定程度上代表了系统的并发用户数。

2.4 响应时间

响应时间:系统对请求做出响应的时间。例如系统处理一个HTTP请求需要200ms,这个200ms就是系统的响应时间。一般而言,用户感知友好的高并发系统,时延应该控制在250毫秒以内。

2.5 PV

PV(Page View):页面访问量,即页面浏览量或点击量,用户每次刷新即被计算一次。可以统计服务一天的访问日志得到。

03 设计思路

互联网分布式架构设计,提高系统并发能力的方式,方法论上主要有两种:垂直扩展(Scale Up,也叫竖向扩展)与水平扩展(Scale Out,也叫横向扩展)。

1、垂直方向:提升单机能力

提升单机处理能力又可分为硬件和软件两个方面:

硬件方向,升级服务器硬件,购买多核高频机器,大内存,大容量磁盘等。

软件方向,包括用更快的数据结构(编程语言级别的并发编程),改进架构,应用多线程、协程(select/poll/epoll等IO多路复用技术),以及上性能优化各种手段,但是这种方式很容易出现瓶颈。

2、水平方向:分布式集群

为了解决分布式系统的复杂性问题,一般会用到架构分层和服务拆分,通过分层做隔离,通过微服务解耦。

这个理论上没有上限,只要做好层次和服务划分,加机器扩容就能满足需求,但实际上并非如此,一方面分布式会增加系统复杂性,另一方面集群规模上去之后,也会引入一堆服务发现、服务治理的新问题。

因为垂直向的限制,所以,我们通常更关注水平扩展,高并发系统的实施也主要围绕水平方向展开。

04 集群化

单机的硬件扩展成本较高,软件优化易出现性能瓶颈,因此利用集群解决高并发问题。负载均衡是常用的解决方案,即把前端流量分配到不同的服务节点上。

在集群化的架构下,可以采用池化(内存池,连接池,线程池),分布式缓存,分布式消息队列,流控技术(服务降级,应用拆分,限流)和数据库高并发(分库分表,读写分离等)提高并发能力。

负载均衡可以分为3种:

1、DNS负载均衡,客户端通过URL发起网络服务请求的时候,会去DNS服务器做域名解释,DNS会按一定的策略(比如就近策略)把URL转换成IP地址,同一个URL会被解释成不同的IP地址,这便是DNS负载均衡,它是一种粗粒度的负载均衡,它只用URL前半部分,因为DNS负载均衡一般采用就近原则,所以通常能降低时延,但DNS有cache,所以也会更新不及时的问题。

2、硬件负载均衡,通过布置F5,A10等专门的负载均衡设备到机房做负载均衡,性能高,但是价格昂贵。

3、软件负载均衡,利用软件实现四层负载均衡(LVS)和七层负载均衡(Nginx)。

05 池化技术

5.1 内存池

内存池创建的方法:

1、对于用户申请的大块内存使用内存映射

2、对于小块内存从内存池合适的链表中取出

注:Linux本身有内存管理方式,但是系统级别的内存优化技术远不能满足实际需求,比较流行的内存优化技术包括tcmalloc、ptmalloc、jemalloc等。

内存池的作用:

1、存放大块数据

2、存放数据缓存

5.2 进程/线程池

进程池和线程池的作用:

1、 避免动态启动的时间开销

2、 使得处理更加单一

3、 充分利用硬件资源

进程池和线程池的注意事项:

1、 典型的生产者消费者问题

2、 注意访问共享资源存在的竞争

5.3 连接池

连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用,比如数据库连接池。

连接池创建的方法:

1、 预先分配固定数据的连接

2、 对每一个连接都分配相应的资源

连接池的作用:

1、 为创建新连接提速

2、 可用于集群内部永久性连接

06 缓存

缓存可以分为本地缓存和分布式缓存。

本地缓存:编程实现(成员变量、局部变量、静态变量)。

分布式缓存:借助Redis、Memcache实现。

一般系统的写入请求远少于读请求,针对写少读多的场景,很适合引入缓存集群。在写数据库的时候同时写一份数据到缓存集群里,然后用缓存承载大部分的读请求,当缓存中不存在的时候才去数据库查找,这样通过缓存集群,就可以用更少的机器资源承载更高的并发。

缓存的命中率一般能做到很高,而且速度很快,处理能力也强(单机很容易做到几万并发),是理想的解决方案。

当然,在使用分布式缓存的时候,需要格外注意处理一致性问题,缓存击穿,缓存穿透,缓存雪崩等问题。

07 消息队列

7.1 概述

分布式缓存在读多写少的场景性能优异,对于写操作较多的场景可以采用消息队列集群,它可以很好地做写请求异步化处理,实现削峰填谷的效果。

消息队列能做解耦,在只需要最终一致性的场景下,很适合用来配合做流控。

业界有很多著名的消息中间件,比如ZeroMQ,rabbitMQ,kafka等。

7.2 特点

1、业务耦合;

2、最终一致性;

3、广播;

4、错峰与流控。

08 流控

在服务出现

8.1 服务降级

自动降级:超时、失败次数、故障、限流

人工降级:秒杀、双11大促等

服务降级要考虑的问题:

1、核心服务、非核心服务

2、是否支持降级,降级策略

8.2 应用拆分

应用拆分原则:

1、业务优先;

2、循序渐进;

3、兼顾技术:重构、分层;

4、可靠性测试

8.3 限流

限流的常用处理手段有:计数器、滑动窗口、漏桶、令牌。

1、计数器法

计数器是一种比较简单的限流算法,在一段时间内,进行计数,与阀值进行比较,到了时间临界点,将计数器清0。

但是,计数器法存在一个时间临界点的问题。比如,在11:50:00到11:59:59这段时间内没有用户请求,然后在12:00:01这一瞬时发出1000个请求,12:00:59又出现1000个请求,在这个临界点可能会承受恶意用户的大量请求,甚至超出系统预期的承受。

2、滑动窗口

由于计数器存在临界点缺陷,后来出现了滑动窗口算法来解决。

滑动窗口

滑动窗口的意思是说把固定时间片,进行划分,并且随着时间的流逝,进行移动,这样就巧妙的避开了计数器的临界点问题。也就是说这些固定数量的可以移动的格子,将会进行计数判断阀值,因此格子的数量影响着滑动窗口算法的精度。

3、漏桶算法

虽然滑动窗口有效避免了时间临界点的问题,但是依然有时间片的概念,而漏桶算法在这方面比滑动窗口而言,更加先进。

漏桶算法

有一个固定的桶,进水的速率是不确定的,但是出水的速率是恒定的,当水满的时候是会溢出的。

4、令牌桶算法

从某种意义上讲,令牌桶算法是对漏桶算法的一种改进,桶算法能够限制请求调用的速率,而令牌桶算法能够在限制调用的平均速率的同时还允许一定程度的突发调用。

在令牌桶算法中,存在一个桶,用来存放固定数量的令牌。算法中存在一种机制,以一定的速率往桶中放令牌。每次请求调用需要先获取令牌,只有拿到令牌,才有机会继续执行,否则选择选择等待可用的令牌、或者直接拒绝。

09 数据库高并发

数据库高并发分为单机高并发(主要是存储引擎实现)和集群高并发:

1、单机高并发

InnoDB存储引擎采用多版本并发控制技术(MVCC)在不加锁的情况下,实现并发读写,同时通过事务隔离级别控制并发效率。

2、集群高并发

数据库集群高并发主要是通过分库分表、主备读写分离等方法实现的。

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

高并发架构设计 的相关文章

  • iocp之简单实现

    一 步骤 二 代码 1 头文件 include
  • Java记录一次百万级别数据扫表统计的任务

    一 需求 统计近200万商家数据 每日通过查询计费系统更新其余额 二 技术栈 抛开分布式定时任务系统Elastic Job之外 我们先优先把单系统极限优化挖掘出来 由于博主接手的是14年的老项目 本地甚至都无法启动 所以不尝试用高级玩法 数
  • 高并发架构设计

    通过本文你将了解 高并发架构概述 高并发度量指标 高并发架构设计思路 高并发方案 池化技术 高并发方案 缓存 高并发方案 消息系列 高并发方案 限流 数据库高并发方案 01 概述 高并发 High Concurrency 是互联网分布式系统
  • NodeJS优缺点及适用场景讨论

    http www xprogrammer com 159 html 概述 NodeJS宣称其目标是 旨在提供一种简单的构建可伸缩网络程序的方法 那么它的出现是为了解决什么问题呢 它有什么优缺点以及它适用于什么场景呢 本文就个人使用经验对这些
  • 高并发解决方案相关面试题

    什么是DNS解析域名 DNS域名解析就是讲域名转化为不需要显示端口 二级域名的端口一般为80 的IP地址 域名解析的一般先去本地环境的host文件读取配置 解析成对应的IP地址 根据IP地址访问对应的服务器 若host文件未配置 则会去网络
  • Tomcat 线程池

    目录 概述 tomcat线程池工作原理 关键源码 Connector 配置 Executor 线程配置 tomcat核心组件 题外 概述 Tomcat 是一个流行的 Java Web 服务器 它使用线程池来处理客户端请求 线程池是一组预先创
  • Java高并发- 锁的优化及 JVM 对锁优化所做的努力

    在高并发环境下 激烈的锁竞争会导致程序的性能下降 所以我们有必要讨论一下有关 锁 的性能问题及注意事项 如 避免死锁 减小锁粒度 锁分离等 一 锁优化 1 1 减小锁持有时间 在锁竞争过程中 单个线程对锁的持有时间与系统性能有着直接的关系
  • java高并发处理 java处理高并发的几种方法

    一 背景综述 并发就是可以使用多个线程或进程 同时处理 就是并发 不同的操作 高并发的时候就是有很多用户在访问 导致系统数据不正确 糗事数据的现象 对于一些大型网站 比如门户网站 在面对大量用户访问 高并发请求方面 基本的解决方案集中在这样
  • MPI测试程序

    include
  • 全到哭,阿里新产2023版Java架构核心宝典,涵盖Java进阶所有主流技术

    导言 什么是架构师 对于程序员来说 聊架构是一个永不过时的话题 实际上 每一家公司都有自己对架构师不同的定位 因为不同的公司 所处的阶段 业务模式以及应用场景都不一样 因此对架构师的要求不一样 所以定位也就不同 但是 无论如何 架构师除了优
  • Sentinel-持久化

    直接使用dashboard和sentinel配置各种规则时 默认是存在了内存中 如果服务器重启那么数据就会丢失 从而Sentinel提供了5中持久化的方式 将各种配置数据进行持久化 若服务器重启就重新加载持久化的数据 防止数据丢失 1 持久
  • 华为19级专家10年心血终成百页负载均衡高并发网关设计实战文档

    负载均衡 LoadBalance 的字面意思是将工作负载分担到多个工作单元上进行执行 它建立在现有网络结构之上 是构建分布式服务 大型网络应用的关键组件 近十几年来 负载均衡技术层出不穷 令人眼花缭乱 如果问身边的技术人员什么是负载均衡 我
  • 多线程(八):并发编程的三大特性之原子性

    目录 通过一个demo认识原子性 java中只有以下操作是原子性的 上锁的本质 那么如何保障数据的一致性呢 如何理解锁的粒度 如何保障操作的原子性 什么是悲观锁 什么是乐观锁 什么是CAS 什么是ABA问题 乐观锁和悲观锁哪种效率跟高 sy
  • Redis分布式锁----乐观锁的实现,以秒杀系统为例

    摘要 本文使用redis来实现乐观锁 并以秒杀系统为实例来讲解整个过程 本文源码请在这里下载 https github com appleappleapple DistributeLearning 乐观锁 大多数是基于数据版本 versio
  • Redis优化秒杀系统

    Redis优化秒杀系统 使用背景 普通的基于mss框架的系统在并发量不是很高的情况下 对redis的需求不是很高 redis在系统中的角色相当于一个对象缓存器 在高并发的系统中 比如秒杀系统 在某一刻对数据库中的一条数据可能是成千上万的用户
  • 高并发,你真的理解透彻了吗

    高并发 几乎是每个程序员都想拥有的经验 原因很简单 随着流量变大 会遇到各种各样的技术问题 比如接口响应超时 CPU load升高 GC频繁 死锁 大数据量存储等等 这些问题能推动我们在技术深度上不断精进 在过往的面试中 如果候选人做过高并
  • 大型网站架构不得不考虑的10个问题

    这里的大型网站架构只包括高互动性高交互性的数据型大型网站 基于大家众所周知的原因 我们就不谈新闻类和一些依靠HTML静态化就可以实现的架构了 我们以高负载高数据交换高数据流动性的网站为例 比如海内 开心网等类似的web2 0系列架构 我们这
  • 分布式系统---幂等性设计

    分布式系统 幂等性设计 WEB资源或API方法的幂等性是指一次和多次请求某一个资源应该具有同样的副作用 幂等性是系统的接口对外一种承诺 而不是实现 承诺只要调用接口成功 外部多次调用对系统的影响是一致的 幂等性是分布式系统设计中的一个重要概
  • Java高并发处理方案

    java高并发 如何解决 什么方式解决 一 什么是高并发 二 高并发解决思路 三 高并发解决方案 一 什么是高并发 1 1 高并发 High Concurrency 是互联网分布式系统架构设计中必须考虑的因素之一 它通常是指 通过设计保证系
  • 4.OpenResty系列之Nginx负载均衡

    1 负载均衡配置 上篇文章中 代理仅仅指向一个服务器 但是 网站在实际运营过程中 大部分都是以集群的方式运行 这时需要使用负载均衡来分流 nginx 也可以实现简单的负载均衡功能 假设这样一个应用场景 将应用部署在 192 168 1 11

随机推荐

  • Vulkan-实践第一弹

    上一篇文章中 我们浅析了Vulkan对传统图形API的优势 主要就是在其性能和精细化操控GPU上 具体可参考Vulkan 性能及精细化 今天我们就来用个简单的例子 亲身感受下Vulkan的开发 魅力 include
  • 网络安全——SQL注入漏洞

    一 SQL注入概述 1 SQL注入漏洞 攻击者利用Web应用程序对用户输入验证上的疏忽 在输入的数据中包含对某些数据库系统有特殊意义的符号或命令 让攻击者有机会直接对后台数据库系统下达指令 进而实现对后台数据库乃至整个应用系统的入侵 2 S
  • 代码审计-弱类型整数大小比较绕过

    temp GET password is numeric temp die no numeric NULL if temp gt 1336 echo flag is numeric 同样可以用数组绕过 00截断 添加其他字符 http 12
  • 为何我的请求报错handshake_failure

    这两天被httpclient发送https请求烦死了老是失败 今天终于连通的于是来说说这几天遇到的坑 首先是域名 因为配置的是公网域名和地址 原来的工程内网用ip访问是不行的 在验证host的时候会给错误不让连 解决方案是修改本机hosts
  • LaTeX学习笔记(表格操作)

    1 创建tabular表格 使用如下语句创建表格 且创建表格时必须声明表格中各元素对其方式 有几列就需要几个对其参数 begin tabular clr c为居中对其 l为左对齐 r为右对齐 表格数据 end tabular 注 表格中用
  • python虚拟环境,conda的安装与使用

    axiner 声明 错了另刂扌丁我 如若有误 记得评论指出 谢谢了 简介 Conda 是一种通用包管理系统 当然包含管理Python 支持linux mac win Anaconda 是一个开源的Python发行版 包含了conda pyt
  • 微信小程序简洁登录页面(附源码)

    文章目录 1 登录页面 2 用户不存在 3 代码 3 1 login wxml 3 2 login css 3 3 login js 4 斜体样式 总结 1 登录页面 登录的具体流程 1 当用户输入密码和账号后首先检验账号和密码是否为空 2
  • 双线性插值_亚像素边缘尺寸测量

    读了好几篇关于亚像素边缘的博客 记录几点收获总结 若有错 还请读者朋友指正 亚像素边缘常见的方法主要是插值法和拟合法 如 近邻插值 双线性插值 三次插值 最小二乘法拟合等 实际并不存在亚像素边缘坐标 可以通过放大或缩小图像获得原图像的亚像素
  • 微信公众号网页授权-java开发

    1 项目需求背景 需要在公众号菜单挂开发的页面 2 参考微信开发文档微信开放文档 我总结了以下几步 正式环境 只需要在公众号平台自定义配置菜单链接 把项目部署到公网 下面重点说一下开发环境如何编写和测试 开发环境 首先你需要一个微信测试账号
  • cadence allegro学习记录(三)

    1 中英文切换 需要17 4 2019 s019以上补丁 此电脑 属性 高级系统设置 环境变量 新建用户变量 变量名 intl enabled 变量置 1 重新启动软件 2 主题设置 setup user preference UI Gen
  • Python格式化输出

    Python格式化输出有两种方式 用百分号 占位实现格式化输出 用format函数和大括号 占位实现格式化输出 推荐 个人喜欢这种方式 用百分号占位实现格式化输出 用百分号加一个英文字母占位 英文字母代表不同的数据类型 参考C语言的形参 实
  • mysql 判断是否日期类型_MySQL:日期类型

    1 datetime 年月日时分秒 格式 YYY MM DD HH MM SS 占用 8字节 范围 1000 01 01 00 00 00 到 9999 12 31 23 59 59 tip 可以接收任意分隔符的日期 主要是判断日期是否正确
  • [OpenAirInterface实战-19] :OAI 软件无线电USRP UHD硬件驱动程序的使用与网络架构

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 121092297 目录 第1章 USR
  • 使用flask实现图片的查看、翻页操作、分类和上传

    本实验使用flask制作一个图像的分类上传界面 首先介绍一下使用方法 一 使用简介 页面如下 1 首先打开 index html 文件 在select标签中添加分类类别 注意 value值应和标签文本一样 将需要分类的图片全部粘贴进imag
  • 60-400-240-使用-binlog-Canal使用文档md

    文章目录 1 世界 2 概述 3 环境要求 3 1 操作系统 3 2 mysql要求 4 配置 5 权限 6 canal部署 6 1 下载 6 2 目录结构 7 启动 8 停止 9 案例 9 1 重启服务 9 2 测试程序 9 2 1 ma
  • java 七牛下载文件_springboot获取七牛云空间文件列表及下载功能

    原文摘自 https www jiagou1216 com 七牛云对象存储的使用方法参考 https www jiagou1216 com blog devops 339 html 第一步 新建springboot项目 引入jar包 其中h
  • pandas(十七)批量拆分与合并Excel文件

    一 Pandas 进行索引和切片的iloc loc方法 iloc是基于整数位置进行索引和切片的方法 它允许您使用整数来访问 DataFrame 或 Series 中的特定行和列import pandas as pd 创建示例 DataFra
  • 推荐一下《探索推荐引擎内部的秘密》

    推荐一下 IBM软件工程师赵晨婷和马春娥的系列文章 探索推荐引擎内部的秘密 IBM Developworks 探索推荐引擎内部的秘密 第 1 部分 推荐引擎初探 http www ibm com developerworks cn web
  • ros配置pcc实现链路负载

    拨号 建立外网连接 使能正常上网 接口配置nat伪装 distance进行配置 接下来进行pcc设置 mangel标记 配置最大包数 标记内网地址x x x x的3条连接标记 从链接中提取路由标记 配置回程路由 需要将数据从哪个口就来就从哪
  • 高并发架构设计

    通过本文你将了解 高并发架构概述 高并发度量指标 高并发架构设计思路 高并发方案 池化技术 高并发方案 缓存 高并发方案 消息系列 高并发方案 限流 数据库高并发方案 01 概述 高并发 High Concurrency 是互联网分布式系统