高并发架构设计

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、集群高并发

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值