一.什么是高并发
多个线程同时访问同一个资源时就会产生并发问题,高并发是判断一个项目优劣的重要因素
二.怎么处理高并发
1.项目使用微服务开发
通过微服务,将一个项目拆分为多个模块,这样将一个服务器的压力就会分摊给多个服务器,而且当某个模块因为访问过高而崩溃时,可以通过服务降级(只读取缓存里的内容等其他方式),熔断保护(拒绝流量访问),延迟处理(设置流量缓冲池,往往使用消息队列,将请求放入缓冲池中)和特权处理(对用户分类优先保护部分用户)这样不会影响项目其他模块的正常使用
2.使用redis等做缓存
在项目中往往是读大于写的,因此可以将频繁访问的数据存入redies中,从而减少直接对数据库的访问。redis为保证高并发时访问的正确性,提供了三种方法:原子操作,分布式锁,事务
3.使用RabbitMQ等其他消息中间键将数据存入消息队列
对于高写入的场景,可以使用消息队列存储,不用redis的原因是应为redis有LRC(最近最少使用)会淘汰数据,且数据结构比较简单,没有事务支持,所以使用消息队列,存入队列中再限制存入数据库里
为什么使用RabbitMQ:
- 有强大的web页面,方便使用
- 安装简单,上手块
- 可靠性高
- 功能丰富,支持消息持久化,支持消息确认机制,灵活的任务分发机制
什么是QOS: 为RabbitMQ提供服务质量保证,在一定数量的消息未被消费前,不进行消费新的消息;例如在限流操作中,每一千条数据存入数据库,当存储没有完成时,不会有新的消息进入。
4.限流
可以使用消息队列对数据做限流,比如一万条请求发送过来可以先存入消息队列中,消息队列是遵循先进先出,再一千条一千条数据的存入数据库中完成限流操作
5.动静分离
通过Nginx实现动静分离,将静态资源交给专门的服务器处理,而tomcat只需要处理动态资源就行,减少后端的压力实现负载均衡
6.数据库优化
分库分表,将一个数据库分为几个数据库,将一个表分为几个表,减少表里的字段,来对抗高并发