简单说明高并发

一. 整体架构

整体架构

技术架构整体式从上到下分为用户触点、接入层、应用层、业务中台、pass、云资源。

二. 高并发处理方案

(1)高并发场景分析

所谓高并发,通常从外部流量和内部系统两个角度看待问题:

  • 对于外部流量来讲,无非就是请求多
  • 对于内部系统来讲,就是请求处理不过来
    通常的解决方法:
  • 对外,限制外部流量来解决。比如过滤无效请求,或者拒绝请求
  • 对内,除了过滤无效请求及拒绝请求外,还要增大系统处理能力

通常高并发场景的问题处理,无外乎围绕这两个角度来解决

类似一个漏斗模型:

并发处理方案

(2)秒杀场景架构

现在以一个秒杀场景的设计,来讲述怎么从上述的方向来解决实际的问题

秒杀场景系统架构

秒杀场景整体来说体现在瞬时流量大,需要系统强大的处理能力

  • 首先需要保证接收的流量有效
  • 其次提升系统的处理能力
  • 保障系统高可用性

系统层级从上到下从前端、负载、网关、应用、中间件、数据库几个层级来设计

1) 前端层面

  1. 前端秒杀开始前,禁止提交请求

  2. 前端控制用户提交请求的频率

  3. 前端发送请求携带唯一请求ID

2) CDN

内容分发平台,负责将静态资源分发到离用户更近的网络服务器上

1)通过降低远程网络开销来提升用户体验

2)并且降低因请求系统资源造成的压力

3)SLB

阿里的高可用负载均衡,通过负载策略将请求分发到不同的服务器上,分散每台机器的压力

4)Nginx

在每个网关服务前面部署Nginx

1)利用Nginx 的限流做第一层系统防护

2)利用Nginx 形成流量开关,控制每个网关的流量进入与否

5) 网关

使用Gateway做网关

1) 计算用户ID的访问频次并存入 Redis,若大于配置频率则拒绝访问

  1. 使用 Redis 布隆过滤器做幂等处理

PS: Redis 幂等校验方案

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是按照下面几 个步骤启动的:

    1. 启动Leaf-Snowflake服务,连接Zookeeper,在leaf_forever父节点下检查自己是否已经注册过(是否有该顺序子节点)。

    2. 如果有注册过直接取回自己的workerID(zk顺序节点生成的int类型ID号),启动服务。

    3. 如果没有注册过,就在该父节点下面创建一个持久顺序节点,创建成功后取回顺序号当做自己的workerID号,启动服务。

leaf-snowflake

12) Seata

分布式事务框架,利用框架解决分布式事务问题

13) MySQL

1)MySQL 采用主备模式,读写分离,降低数据库的压力

2)采用PXC 做高可用方案,实现Mysql 的高可用

PS: PXC 工作流程

PXC

PXC 的所有请求都会在本地节点先执行,在进行数据提交时会先把数据分发到其他节点,其他节点若验证通过则将数据应用到自己的数据库,然后发送 ok 到本地节点,本地节点收到成功的响应后提交事务返回成功;若其他节点验证失败则直接抛弃数据返回 not ok,本地节点收到失败指令后回滚记录。

14) MyCat 做分库分表

MyCat 作为分库分表的中间件,利用范围分片做表分片,订单采用日期作为分片字段,通过会查询最近日期范围内数据,采用范围分片适用于此场景

分库分表

1)分库:

按业务拆分,不同业务的表拆到不同的数据库中。

1.单机拆分多个Schema 的形式进行数据库拆分。对单机性能不会提升,不考虑

2.分为不同服务器的数据库拆分

优点:流量分散到不同数据库, 使整体系统资源能力提升

缺点:会有分布式事务问题

2)分表

垂直拆分:单表字段太多

水平分区:单表数据量太大

水平分片方式:

  1. Hash 分片:分片字段Hash值%分片个数

优点:数据分散均匀

缺点:扩展性差, 每次扩展所有数据都得重新取模, 做数据迁移

适用场景:数据本身随机,查询随机的场景

  1. 范围分片:适用于分片字段自增长的数据

优点:自动水平扩展

缺点:数据集中, 会出现单机访问过于频繁的情况

适用场景:分片字段自增长,并且会根据分片字段查询分片范围内数据多的场景

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容