Hi ! 我是小小,明天是本周的第六篇,本月的最初一篇,你还好吗?我是小小,咱们本周的内容是大话高并发架构
前言
高并发常常会产生在有大量用户量,用户高汇集的业务场景,例如秒杀流动,定时支付红包。
为了让业务能够在高并发的时候可能相当好的运行,并给用户一个良好的交互体验,所以,思考各种高并发的场景,设计高并发架构。
服务器架构
业务从初期到成熟,从繁多到集群,最初到分布式,须要有服务器的负载平衡,数据的主从复制,nosql的各种集群,动态文件上传cdn等等。
须要用到的服务器架构如下
服务器
负载平衡,如阿里云的slb 或者是nginx
资源监控
分布式
数据库
主从拆散,集群
DBA表优化,索引优化
分布式
nosql
redis:主从拆散,集群
mongodb: 主从拆散,集群
memcache:主从拆散,集群
cdn
html
css
js
image
并发测试
对于高并发业务,须要进行高并发的业务测试,通过大量的数据分析评估整个架构撑持的并发量。
测试并发应用的工具如下
阿里云性能测试
jmetter
visual studio 性能负载测试
Microsoft Web Application Stress Tool
实现计划
通用计划
日用户流量大,然而比拟扩散,偶然会有用户聚合的状况
场景
用户签到,用户核心,用户订单
服务器架构
阐明
这些场景,根本都是用户进入app后会操作,这些用户不会高汇集,同时这些表又是大的数据表,业务很多,所以须要缩小DB的查问,优先查问缓存,如果缓存不存在,再命中DB。
所以须要应用缓存,为了升高缓存,所以应用分布式的缓存,对DB实现hash分组,把用户散布到不同的缓存中,不会影响查问效率。
计划
用户签到
- 计算用户散布的key,redis hash中查找用户今日签到的音讯
- 能查问到,返回查问的信息
- 如果没有查问到,DB查问今日是否抢到过,如果抢到过,信息同步redis
- 如果db也没有查问到,进行签到逻辑,db增加今日签到记录。这是一个事物
- 缓存签到信息到redis,返回签到信息
用户订单
- 这里只缓存第一页订单信息
- 用户拜访订单列表,如果是第一页读缓存,如果不是读DB
- 计算出用户散布的key,redis hash中查找用户订单信息
- 如果能查问到用户订单信息,返回订单信息
- 如果不存在用户信息,就间接db查问第一页 订单数据,而后缓存redis,返回订单信息
用户核心
- 计算用户key,redis hash 中查找出用户订单信息
- 能查找到,返回用户信息
- 如果未找到,缓存redis,返回用户信息
以上的仅仅是一个绝对于比较简单的并发架构
音讯队列
用于缓存秒杀,流动,用户在一瞬间涌入产生的高并发的申请
场景:
定时支付红包。
架构
阐明
场景中的定时支付是一个高并发的业务,秒杀流动会在一瞬间涌入。
这种业务会间接命中DB,会导致数据的解体。
设计这种业务的时候,须要应用音讯队列,能够把参加的用户信息增加到音讯队列中,而后迟缓的耗费。
计划
- 定时支付红包:
应用redis的list
当用户参加流动,用户信息push到队列中
书写多个线程去pop数据,进行发放红包的业务。
一级缓存
一级缓存就是应用站点服务器去缓存数据,只缓存局部申请量大的数据,并且数据量还须要管制,一级缓存须要设置秒为单位的过期工夫,具体业务场景看业务场景而定,目标是有高并发的时候能够让数据获取命中到一级缓存,缩小nosql的压力。
架构图
场景
APP首屏的数据接口
动态化数据
对于更新不频繁,并且数据容许短时间内的提早,能够通过数据动态化成json,xml,html等数据文件上传cdn,而后拉取数据的时候优先拉取cdn,而后再缓存,最初数据库,用于加重db的压力。
分层,宰割,分布式
大型网站须要很好的撑持高并发,这须要很长的规划设计,次要须要如下
- 分层:
零碎在横向维度切分成几个局部,每个部门负责一部分绝对简略并且繁多的职责,而后通过下层,对上层的残缺依赖造成一个残缺的零碎。
例如把一个电商分为,应用层,服务层,数据层。
应用层:网站首页,用户核心
服务层:订单服务,用户治理服务
数据层:关系型数据库,nosql数据库。 - 宰割
在纵向对业务进行切分
例如,用户核心能够宰割成为账户信息模块,订单模块,充值模块,提现模块,优惠券模块 - 分布式
分布式应用和服务,把利用进行分布式部署。
当业务达到肯定用户量的时候,须要对服务器进行负载平衡,数据库,缓存主从集群
分布式动态资源,动态资源上传cdn
分布式计算,应用hadoop进行大数据分布式计算
集群
对于用户拜访集中的服务器,搭建集群,通过负载平衡独特对外提供服务,当有更多的用户拜访的时候,只须要加机器即可。
ngixn反向代理
slb
数据库的主从拆散
异步
在高并发业务场景中,如果波及到数据库操作,次要压力是在数据库服务器上,当连贯数量达到最大值的时候,有其余连贯数据库的申请操作的时候,就须要有闲暇的连贯。
场景
主动弹窗签到
双十一抢红包
双十一订单入库
设计
应用音讯队列,把入库的内容放入到音讯队列中,业务接口间接返回提醒,高峰期提早到账。
而后再写独立程序从音讯队列中,读取进行入库操作,入库胜利当前刷新缓存,如果入库失败,记录日志,不便查问反馈和从新长久化。
补充
其余场景,例如短信发送
面向服务
soa 面向服务架构设计
微服务更加细腻度的服务化。
例子
用户行为跟踪记录统计
阐明
通过上报利用模块,操作事件,事件对象,等数据,记录用户操作行为。
例如用户在某个商品模块点击了某一件商品,或者看了某一件商品。
架构
node.js web 利用负载平衡
redis主从集群
mysql主从复制
nodejs + express + ejs + redis + mysql
冗余自动化
当高并发业务呈现单击的时候,须要疾速的有备用的代替,所以须要自动化执行这些操作
冗余
数据库备份
备份服务器
自动化
自动化监控
自动化报警
自动化降级
对于作者
我是小小,一枚生于二线,活在一线城市的程序猿,我是小小,咱们下期再见。