大话程序猿眼里的高并发架构

上传人:d**** 文档编号:53262754 上传时间:2022-02-10 格式:DOC 页数:17 大小:49KB
收藏 版权申诉 举报 下载
大话程序猿眼里的高并发架构_第1页
第1页 / 共17页
大话程序猿眼里的高并发架构_第2页
第2页 / 共17页
大话程序猿眼里的高并发架构_第3页
第3页 / 共17页
资源描述:

《大话程序猿眼里的高并发架构》由会员分享,可在线阅读,更多相关《大话程序猿眼里的高并发架构(17页珍藏版)》请在装配图网上搜索。

1、.、八、一前言高并发经常会发生在有大活跃用户量,用户高聚集的业务场景中,如:秒杀活动,定 时领取红包等。为了让业务可以流畅的运行并且给用户一个好的交互体验,我们需要根据业务场景预 估达到的并发量等因素,来设计适合自己业务场景的高并发处理方案。在电商相关产品开发的这些年,我有幸的遇到了并发下的各种坑,这一路摸爬滚打过 来有着不少的血泪史,这里进行的总结,作为自己的归档记录,同时分享给大家。 服务器架构业务从发展的初期到逐渐成熟,服务器架构也是从相对单一到集群,再到分布式服 务。一个可以支持高并发的服务少不了好的服务器架构,需要有均衡负载,数据库需要主 从集群, nosql 缓存需要主从集群,静态

2、文件需要上传 cdn ,这些都是能让业务程序 流畅运行的强大后盾。服务器这块多是需要运维人员来配合搭建,具体我就不多说了,点到为止。大致需要用到的服务器架构如下:服务器均衡负载 (如: nginx ,阿里云 SLB)资源监控分布式数据库主从分离,集群DBA 表优化,索引优化,等分布式nosql主从分离,集群主从分离,集群主从分离,集群redismongodbmemcachecdnhtmlcssjsimage并发测试 高并发相关的业务,需要进行并发的测试,通过大量的数据分析评估出整个架构可以 支撑的并发量。测试高并发可以使用第三方服务器或者自己测试服务器,利用测试工具进行并发请求测试,分析测试数

3、据得到可以支撑并发数量的评估,这个可以作为一个预警参考,俗 话说知己自彼百战不殆。第三方服务:阿里云性能测试并发测试工具:Apache JMeterVisual Studio 性能负载测试Microsoft Web Application Stress Tool实战方案通用方案日用户流量大,但是比较分散,偶尔会有用户高聚的情况;场景: 用户签到,用户中心,用户订单,等服务器架构图:说明:场景中的这些业务基本是用户进入 APP 后会操作到的,除了活动日 (618, 双 11,等 ), 这些业务的用户量都不会高聚集,同时这些业务相关的表都是大数据表,业务多是查 询操作,所以我们需要减少用户直接命中

4、 DB 的查询;优先查询缓存,如果缓存不存 在,再进行 DB 查询,将查询结果缓存起来。更新用户相关缓存需要分布式存储,比如使用用户 ID 进行 hash 分组,把用户分布到 不同的缓存中,这样一个缓存集合的总量不会很大,不会影响查询效率。方案如:用户签到获取积分计算出用户分布的 key,redis hash 中查找用户今日签到信息 如果查询到签到信息,返回签到信息如果没有查询到, DB 查询今日是否签到过,如果有签到过,就把签到信息同步 redis 缓存。如果 DB 中也没有查询到今日的签到记录,就进行签到逻辑,操作 DB 添加今 日签到记录,添加签到积分 (这整个 DB 操作是一个事务 )

5、缓存签到信息到 redis ,返回签到信息 注意这里会有并发情况下的逻辑问题,如:一天签到多次,发放多次积分给 用户。 我的博文大话程序猿眼里的高并发有相关的处理方案。用户订单这里我们只缓存用户第一页的订单信息,一页 40 条数据,用户一般也只会看 第一页的订单数据用户访问订单列表,如果是第一页读缓存,如果不是读 DB 计算出用户分布的 key,redis hash 中查找用户订单信息 如果查询到用户订单信息,返回订单信息如果不存在就进行 DB 查询第一页的订单数据,然后缓存 redis ,返回订单信 息用户中心计算出用户分布的 key,redis hash 中查找用户订单信息 如果查询到用户

6、信息,返回用户信息 如果不存在进行用户 DB 查询,然后缓存 redis ,返回用户信息其他业务 上面例子多是针对用户存储缓存,如果是公用的缓存数据需要注意一些问题, 如下DB 查询,可以使注意公用的缓存数据需要考虑并发下的可能会导致大量命中 用管理后台更新缓存,或者 DB 查询的锁住操作。我的博文大话 Redis 进阶对更新缓存问题和推荐方案的分享。以上例子是一个相对简单的高并发架构,并发量不是很高的情况可以很好的支撑, 但是随着业务的壮大,用户并发量增加,我们的架构也会进行不断的优化和演变, 比如对业务进行服务化,每个服务有自己的并发架构,自己的均衡服务器,分布 式数据库, nosql 主

7、从集群,如:用户服务、订单服务;消息队列秒杀、秒抢等活动业务,用户在瞬间涌入产生高并发请求场景:定时领取红包,等服务器架构图:说明:DB 瞬场景中的定时领取是一个高并发的业务,像秒杀活动用户会在到点的时间涌入, 间就接受到一记暴击, hold 不住就会宕机,然后影响整个业务;像这种不是只有查询的操作并且会有高并发的插入或者更新数据的业务,前面提到的 通用方案就无法支撑,并发的时候都是直接命中 DB ; 设计这块业务的时候就会使用消息队列的,可以将参与用户的信息添加到消息队列中, 然后再写个多线程程序去消耗队列,给队列中的用户发放红包;方案如:定时领取红包一般习惯使用 redis 的 list

8、当用户参与活动,将用户参与信息 push 到队列中 然后写个多线程程序去 pop 数据,进行发放红包的业务 这样可以支持高并发下的用户可以正常的参与活动,并且避免数据库服务器 宕机的危险附加:通过消息队列可以做很多的服务。如:定时短信发送服务,使用 sset(sorted set) ,发送时间戳作为排序依据,短信数据 队列根据时间升序,然后写个程序定时循环去读取 sset 队列中的第一条,当前时间是 否超过发送时间,如果超过就进行短信发送。级缓存高并发请求连接缓存服务器超出服务器能够接收的请求连接量,部分用户出现建立连 接超时无法读取到数据的问题;因此需要有个方案当高并发时候时候可以减少命中缓

9、存服务器;这时候就出现了一级缓存的方案,一级缓存就是使用站点服务器缓存去存储数据,注意只存储部分请求量大的数据,并且缓存的数据量要控制,不能过分的使用站点服务器的内存而影响了站点应用程序的正常运行,一级缓存需要设置秒单位的过期时间,具体时间根据业务场景设定,目的是当有高并发请求的时候可以让数据的获取命中到 一级缓存,而不用连接缓存 nosql 数据服务器,减少 nosql 数据服务器的压力比如 APP 首屏商品数据接口,这些数据是公共的不会针对用户自定义,而且这些数据不会频繁的更新,像这种接口的请求量比较大就可以加入一级缓存;服务器架构图:合理的规范和使用 nosql 缓存数据库,根据业务拆分

10、缓存数据库的集群,这样基本可以很好支持业务,一级缓存毕竟是使用站点服务器缓存所以还是要善用。静态化数据 高并发请求数据不变化的情况下如果可以不请求自己的服务器获取数据那就可以减少服务 器的资源压力。对于更新频繁度不高,并且数据允许短时间内的延迟,可以通过数据静态化成 JSON , XML,HTML 等数据文件上传 CDN ,在拉取数据的时候优先到 CDN 拉取,如果没有获取 到数据再从缓存,数据库中获取,当管理人员操作后台编辑数据再重新生成静态文件上传 同步到 CDN ,这样在高并发的时候可以使数据的获取命中在 CDN 服务器上。CDN 节点同步有一定的延迟性,所以找一个靠谱的 CDN 服务器

11、商也很重要其他方案对于更新频繁度不高的数据, APP,PC 浏览器,可以缓存数据到本地,然后每次请求 接口的时候上传当前缓存数据的版本号,服务端接收到版本号判断版本号与最新数据 版本号是否一致,如果不一样就进行最新数据的查询并返回最新数据和最新版本号, 如果一样就返回状态码告知数据已经是最新。减少服务器压力:资源、带宽等 .分层,分割,分布式大型网站要很好支撑高并发,这是需要长期的规划设计在初期就需要把系统进行分层,在发展过程中把核心业务进行拆分成模块单元,根据需求进行分布式部署,可以进行独立团队维护开发分层将系统在横向维度上切分成几个部分,每个部门负责一部分相对简单并比较 单一的职责,然后通

12、过上层对下层的依赖和调度组成一个完整的系统 比如把电商系统分成:应用层,服务层,数据层。 ( 具体分多少个层次根据自 己的业务场景 ) 应用层:网站首页,用户中心,商品中心,购物车,红包业务,活动中心等, 负责具体业务和视图展示服务层:订单服务,用户管理服务,红包服务,商品服务等,为应用层提供 服务支持数据层:关系数据库, nosql 数据库 等,提供数据存储查询服务 分层架构是逻辑上的,在物理部署上可以部署在同一台物理机器上,但是随 着网站业务的发展,必然需要对已经分层的模块分离部署,分别部署在不同 的服务器上,使网站可以支撑更多用户访问分割在纵向方面对业务进行切分,将一块相对复杂的业务分割

13、成不同的模块单元 包装成高内聚低耦合的模块不仅有助于软件的开发维护,也便于不同模块的 分布式部署,提高网站的并发处理能力和功能扩展 比如用户中心可以分割成:账户信息模块,订单模块,充值模块,提现模块, 优惠券模块等分布式分布式应用和服务 ,将分层或者分割后的业务分布式部署,独立的应用服务器, 数据库,缓存服务器 当业务达到一定用户量的时候,再进行服务器均衡负载,数据库,缓存主从 集群分布式静态资源,比如:静态资源上传 cdn 分布式计算,比如:使用 hadoop 进行大数据的分布式计算 分布式数据和存储 ,比如:各分布节点根据哈希算法或其他算法分散存储数据网站分层 -图1 来自网络集群对于用户

14、访问集中的业务独立部署服务器,应用服务器,数据库, nosql 数据库。 核 心业务基本上需要搭建集群,即多台服务器部署相同的应用构成一个集群,通过负载 均衡设备共同对外提供服务, 服务器集群能够为相同的服务提供更多的并发支持,因 此当有更多的用户访问时,只需要向集群中加入新的机器即可, 另外可以实现当其中的某台服务器发生故障时,可以通过负载均衡的失效转移机制将请求转移至集群中其他 的服务器上,因此可以提高系统的可用性应用服务器集群nginx 反向代理slb(关系 /nosql) 数据库集群主从分离,从库集群通过反向代理均衡负载 - 图 2 来自网络曰止异步在高并发业务中如果涉及到数据库操作,

15、主要压力都是在数据库服务器上面,虽然使用主从分离,但是数据库操作都是在主库上操作,单台数据库服务器连接池允许的最 大连接数量是有限的当连接数量达到最大值的时候,其他需要连接数据操作的请求就需要等待有空闲的连 接,这样高并发的时候很多请求就会出现connection time out的情况那么像这种高并发业务我们要如何设计开发方案可以降低数据库服务器的压力呢?如:自动弹窗签到,双 11 跨 0 点的时候并发请求签到接口 双 11 抢红包活动双 11 订单入库设计考虑: 逆向思维,压力在数据库,那业务接口就不进行数据库操作不就没压力了 数据持久化是否允许延迟?如何让业务接口不直接操作 DB ,又可

16、以让数据持久化?像这种涉及数据库操作的高并发的业务,就要考虑使用异步了 客户端发起接口请求,服务端快速响应,客户端展示结果给用户,数据库操 作通过异步同步如何实现异步同步?使用消息队列,将入库的内容 enqueue 到消息队列中,业务接口快速响应给 用户结果 (可以温馨提示高峰期延迟到账 ) 然后再写个独立程序从消息队列 dequeue 数据出来进行入库操作,入库成功 后刷新用户相关缓存,如果入库失败记录日志,方便反馈查询和重新持久化 这样一来数据库操作就只有一个程序 (多线程 )来完成,不会给数据带来压力补充:消息队列除了可以用在高并发业务,其他只要有相同需求的业务也是可以使 用,如:短信发

17、送中间件等高并发下异步持久化数据可能会影响用户的体验,可以通过可配置的方式, 或者自动化监控资源消耗来切换时时或者使用异步,这样在正常流量的情况 下可以使用时时操作数据库来提高用户体验异步同时也可以指编程上的异步函数,异步线程,在有的时候可以使用异步 操作,把不需要等待结果的操作放到异步中,然后继续后面的操作,节省了 等待的这部分操作的时间缓存高并发业务接口多数都是进行业务数据的查询,如:商品列表,商品信息,用户信息, 红包信息等,这些数据都是不会经常变化,并且持久化在数据库中高并发的情况下直接连接从库做查询操作,多台从库服务器也抗不住这么大量的连接 请求数(前面说过,单台数据库服务器允许的最

18、大连接数量是有限的)那么我们在这种高并发的业务接口要如何设计呢?设计考虑:还是逆向思维,压力在数据库,那么我们就不进行数据库查询 数据不经常变化,我们为啥要一直查询 DB ?数据不变化客户端为啥要向服务器请求返回一样的数据?数据不经常变化,我们可以把数据进行缓存,缓存的方式有很多种,一般的: 应用服务器直接 Cache 内存,主流的:存储在 memcache 、 redis 内存数据 库Cache 是直接存储在应用服务器中,读取速度快,内存数据库服务器允许连 接数可以支撑到很大,而且数据存储在内存,读取速度快,再加上主从集群, 可以支撑很大的并发查询 根据业务情景,使用配合客户端本地存,如果我

19、们数据内容不经常变化,为 啥要一直请求服务器获取相同数据,可以通过匹配数据版本号,如果版本号 不一样接口重新查询缓存返回数据和版本号,如果一样则不查询数据直接响应这样不仅可以提高接口响应速度,也可以节约服务器带宽,虽然有些服务器带宽是按流量计费,但是也不是绝对无限的,在高并发的时候服务器带宽也 可能导致请求响应慢的问题补充:缓存同时也指静态资源客户端缓存cdn 缓存,静态资源通过上传 cdn , cdn 节点缓存我们的静态资源,减少服务器压力面向服务SOA 面向服务架构设计 微服务更细粒度服务化,一系列的独立的服务共同组成系统使用服务化思维,将核心业务或者通用的业务功能抽离成服务独立部署,对外

20、提供接 口的方式提供功能。最理想化的设计是可以把一个复杂的系统抽离成多个服务,共同组成系统的业务,优 点:松耦合,高可用性,高伸缩性,易维护。通过面向服务化设计,独立服务器部署,均衡负载,数据库集群,可以让服务支撑更 高的并发服务例子:用户行为跟踪记录统计说明:通过上报应用模块,操作事件,事件对象,等数据,记录用户的操作行为比如:记录用户在某个商品模块,点击了某一件商品,或者浏览了某一件商背景:由于服务需要记录用户的各种操作行为,并且可以重复上报,准备接入服务的业务又是核心业务的用户行为跟踪,所以请求量很大,高峰期会产生大量 并发请求。架构:nodejs WEB 应用服务器均衡负载redis

21、主从集群mysql 主nodejs+express+ejs+redis+mysql服务端采用 nodejs,nodejs 是单进程( PM2 根据 cpu 核数开启多个工作进程),采用事件驱动机制,适合 I/O 密集型业务,处理高并发能力强业务设计:并发量大,所以不能直接入库,采用:异步同步数据,消息队列请求接口上报数据,接口将上报数据 push 到 redis 的 list 队列中 nodejs 写入库脚本,循环 pop redis list 数据,将数据存储入库,并进行相 关统计 Update ,无数据时 sleep 几秒 因为数据量会比较大,上报的数据表按天命名存储接口:上报数据接口统计

22、查询接口上线跟进:服务业务基本正常每天的上报表有上千万的数据冗余,自动化当高并发业务所在的服务器出现宕机的时候,需要有备用服务器进行快速的替代,在 应用服务器压力大的时候可以快速添加机器到集群中,所以我们就需要有备用机器可 以随时待命。 最理想的方式是可以通过自动化监控服务器资源消耗来进行报警,自动 切换降级方案,自动的进行服务器替换和添加操作等,通过自动化可以减少人工的操 作的成本,而且可以快速操作,避免人为操作上面的失误。冗余数据库备份备用服务器自动化自动化监控自动化报警自动化降级通过 GitLab 事件,我们应该反思,做了备份数据并不代表就万无一失了,我们需要保 证高可用性,首先备份是否正常进行,备份数据是否可用,需要我们进行定期的检查, 或者自动化监控, 还有包括如何避免人为上的操作失误问题。 ( 不过事件中 gitlab 的 开放性姿态,积极的处理方式还是值得学习的 )总结高并发架构是一个不断衍变的过程,冰洞三尺非一日之寒,长城筑成非一日之功 。打好基础架构方便以后的拓展,这点很重要。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!