一. 整体架构
技术架构整体式从上到下分为用户触点、接入层、应用层、业务中台、pass、云资源。
二. 高并发处理方案
(1)高并发场景分析
所谓高并发,通常从外部流量和内部系统两个角度看待问题:
- 对于外部流量来讲,无非就是请求多
- 对于内部系统来讲,就是请求处理不过来
通常的解决方法: - 对外,限制外部流量来解决。比如过滤无效请求,或者拒绝请求
- 对内,除了过滤无效请求及拒绝请求外,还要增大系统处理能力
通常高并发场景的问题处理,无外乎围绕这两个角度来解决
类似一个漏斗模型:
(2)秒杀场景架构
现在以一个秒杀场景的设计,来讲述怎么从上述的方向来解决实际的问题
秒杀场景整体来说体现在瞬时流量大,需要系统强大的处理能力
- 首先需要保证接收的流量有效
- 其次提升系统的处理能力
- 保障系统高可用性
系统层级从上到下从前端、负载、网关、应用、中间件、数据库几个层级来设计
1) 前端层面
前端秒杀开始前,禁止提交请求
前端控制用户提交请求的频率
前端发送请求携带唯一请求ID
2) CDN
内容分发平台,负责将静态资源分发到离用户更近的网络服务器上
1)通过降低远程网络开销来提升用户体验
2)并且降低因请求系统资源造成的压力
3)SLB
阿里的高可用负载均衡,通过负载策略将请求分发到不同的服务器上,分散每台机器的压力
4)Nginx
在每个网关服务前面部署Nginx
1)利用Nginx 的限流做第一层系统防护
2)利用Nginx 形成流量开关,控制每个网关的流量进入与否
5) 网关
使用Gateway做网关
1) 计算用户ID的访问频次并存入 Redis,若大于配置频率则拒绝访问
- 使用 Redis 布隆过滤器做幂等处理
PS: Redis 幂等校验方案
6) Application
应用层
1)使用Hystrix 做服务熔断,起到保护系统及防止系统雪崩的发送
2)接收请求放入MQ
7) MQ
消息中间件
1)接收高并发量的请求,起到消峰的作用
2)同步请求异步处理,起到系统解耦的目的
8) Redis 锁
1.使用Redis 分布式锁,解决分布式锁问题,并且在效率上也有一定优势
2.Redis 使用集群模式部署,分散服务的读写压力
9) Redis 缓存
使用 Redis 将热数据存到缓存中,降低DB 的读取压力
10) Redis 预扣库存
使用 Redis 的 List 来管理库存的预扣与增加
1)效率高
2)减少因 DB 库存的频繁读写造成的压力
PS: Redis 库存管理方案
11.) Zookeeper
使用ZK 结合雪花算法生成分布式唯一ID,以此做为订单ID(leaf 服务)
1)解决分布式ID 的唯一性
2)弱依赖ZK 提高系统的可靠性
PS: leaf 服务原理 Leaf-snowflake是按照下面几 个步骤启动的:
启动Leaf-Snowflake服务,连接Zookeeper,在leaf_forever父节点下检查自己是否已经注册过(是否有该顺序子节点)。
如果有注册过直接取回自己的workerID(zk顺序节点生成的int类型ID号),启动服务。
如果没有注册过,就在该父节点下面创建一个持久顺序节点,创建成功后取回顺序号当做自己的workerID号,启动服务。
12) Seata
分布式事务框架,利用框架解决分布式事务问题
13) MySQL
1)MySQL 采用主备模式,读写分离,降低数据库的压力
2)采用PXC 做高可用方案,实现Mysql 的高可用
PS: PXC 工作流程
PXC 的所有请求都会在本地节点先执行,在进行数据提交时会先把数据分发到其他节点,其他节点若验证通过则将数据应用到自己的数据库,然后发送 ok 到本地节点,本地节点收到成功的响应后提交事务返回成功;若其他节点验证失败则直接抛弃数据返回 not ok,本地节点收到失败指令后回滚记录。
14) MyCat 做分库分表
MyCat 作为分库分表的中间件,利用范围分片做表分片,订单采用日期作为分片字段,通过会查询最近日期范围内数据,采用范围分片适用于此场景
分库分表
1)分库:
按业务拆分,不同业务的表拆到不同的数据库中。
1.单机拆分多个Schema 的形式进行数据库拆分。对单机性能不会提升,不考虑
2.分为不同服务器的数据库拆分
优点:流量分散到不同数据库, 使整体系统资源能力提升
缺点:会有分布式事务问题
2)分表
垂直拆分:单表字段太多
水平分区:单表数据量太大
水平分片方式:
- Hash 分片:分片字段Hash值%分片个数
优点:数据分散均匀
缺点:扩展性差, 每次扩展所有数据都得重新取模, 做数据迁移
适用场景:数据本身随机,查询随机的场景
- 范围分片:适用于分片字段自增长的数据
优点:自动水平扩展
缺点:数据集中, 会出现单机访问过于频繁的情况
适用场景:分片字段自增长,并且会根据分片字段查询分片范围内数据多的场景