高并发系统如何设计
一、总结
一句话总结:
http连接池+NIO+线程池(多生产者多消费者)(反向代理服务器,一致性哈希算法)+ 阻塞队列+
缓存(主从、集群)+
数据库连接池 + 数据库(集群、分库主从)
1、http连接池优点?
1、降低延迟:如果不采用连接池,每次连接发起Http请求的时候都会重新建立TCP连接(经历3次握手),用完就会关闭连接(4次挥手),如果采用连接池则减少了这部分时间损耗,别小看这几次握手,本人经过测试发现,基本上3倍的时间延迟
2、支持更大的并发:如果不采用连接池,来一个请求,就创建一个连接,导致资源瓶颈,无法建立新的连接。所以采用连接池,连接的复用,可以提高并发访问量。
2、反向代理服务器的作用是什么?
可以保护服务器的安全 + 直接返回静态资源
可以保护服务器的安全,来自互联网的请求必需经过代理服务器。所以也可以在代理服务器放一些静态数据,当用户第一次访问静态内容时,静态内容就被缓存在反向代理服务器上,其他用户请求进来时,就可以直接返回,减轻web服务器负载压力。
3、高并发的小策略如何记忆(可以用分类记忆,如何分类记忆)?
客户端实现高并发的小策略:http连接池、预加载静态资源
服务端实现高并发的小策略:压缩数据、反向代理服务器、NIO模型、线程池、阻塞队列、使用缓存、布隆过滤器去重
数据库实现高并发的小策略:数据库连接池、查询优化、主从数据库、数据库存储关键信息
4、客户端实现高并发的小策略?
http连接池、预加载静态资源
1、http连接池:设置http连接池,可以降低延迟,提高客户端响应时间。还可以连接池复用,支持更大的并发量。
2、预加载静态资源:把一些静态资源先加载到浏览器缓存里面,减少服务器端的压力
5、服务端实现高并发的小策略?
压缩数据、反向代理服务器、NIO模型、线程池、阻塞队列、使用缓存、布隆过滤器去重
3、压缩数据 :可以对服务器端的数据进行压缩
4、反向代理服务器:反向代理服务器可以保护服务器的安全,来自互联网的请求必需经过代理服务器。所以也可以在代理服务器放一些静态数据,当用户第一次访问静态内容时,静态内容就被缓存在反向代理服务器上,其他用户请求进来时,就可以直接返回,减轻web服务器负载压力。
5、NIO模型(是在Linux还是Windows系统下,Windows建议用AIO,Linux系统下AIO的底层也是基于epoll多路复用,差别不大,LF的区别)
6、线程池(根据线程池处理不同性质的任务,要有不同性质的线程池,IO密集型,CPU*2。CPU密集型,CPU+1.多生产者多消费这模型)线程池还需要考虑:a.先设置一个最大线程数量和最小线程数量,进行性能评估,压测。b.线程池阻塞队列的大小要有界,否则服务器压力过大。c.须考虑线程池的失败策略,失败后的补偿。d.后台批处理服务须与线上面向用户的服务进行分离。
7、阻塞队列,因为NIO第二个阶段会引起用户线程的阻塞,比如可能等待JDBC连接数据库,因此在这里用一个阻塞队列,线程把请求放到阻塞队列里面,这个线程就可以回归线程池,处理别的事情了。是一个生产者消费者模型
10、使用缓存,减少数据库的访问次数,提高并发量。1)缓存的结构,LRU,链表(集合类存放超时对象),大小,时间。2)核心业务和非核心业务进行分离,减少相互影响的可能性,不要使用共享缓存。3)不常用的数据不要使用缓存。4)夜间查询一天之类搜索频率比较高的词汇,结合AI进行预测,预测的结果预先放到缓存里面。5)考虑分布式缓存数据库:Redis、memcached,防止本地缓存内存溢出。Redis的主从同步,读写分离、负载均衡。主从+一级二级缓存+哨兵。哨兵是Redis 的高可用性解决方案:由一个或多个哨兵实例 组成的哨兵 系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器。
12、布隆过滤器去重:若有重复数据,布隆过滤器去重。
6、数据库实现高并发的小策略?
数据库连接池、查询优化、主从数据库、数据库存储关键信息
8、数据库连接池:建一个数据库连接池,主要是为了减少资源的消耗、减少延迟。
9、查询优化:数据存储部分,1)根据实际情况设置索引和优化SQL语句。2)幂等、乐观、悲观。3)防止SQL注入攻击。4)一个事务当中操作不要过多,可能会阻塞,进而累积造成数据库的故障。5)数据量太大,查询的时间利用limit关键字进行分页处理,防止结果集太大,让应用OOM。
11、主从数据库:主从有瓶颈,会有延迟、主服务器压力过大。考虑集群、分库分表。考虑用一致性哈希算法实现分布式缓存数据库。数据迁移量小,引入虚拟节点、防止数据倾斜。
13、数据库存储关键信息:数据库存储文件名之类的,服务器保存实际的数据。
二、高并发系统的设计(转)
转自:高并发系统的设计
https://blog.csdn.net/qiuchaoxi/article/details/81012384
一、http连接池优点:
1、降低延迟:如果不采用连接池,每次连接发起Http请求的时候都会重新建立TCP连接(经历3次握手),用完就会关闭连接(4次挥手),如果采用连接池则减少了这部分时间损耗,别小看这几次握手,本人经过测试发现,基本上3倍的时间延迟
2、支持更大的并发:如果不采用连接池,来一个请求,就创建一个连接,导致资源瓶颈,无法建立新的连接。所以采用连接池,连接的复用,可以提高并发访问量。
二、高并发系统的设计:
http连接池+NIO+线程池(多生产者多消费者)(反向代理服务器,一致性哈希算法)+阻塞队列+数据库连接池+缓存(主从、集群)+数据库(集群、分库主从)。
细节:
1、设置http连接池,可以降低延迟,提高客户端响应时间。还可以连接池复用,支持更大的并发量。
2、把一些静态资源先加载到浏览器缓存里面,减少服务器端的压力
3、可以对服务器端的数据进行压缩
4、反向代理服务器可以保护服务器的安全,来自互联网的请求必需经过代理服务器。所以也可以在代理服务器放一些静态数据,当用户第一次访问静态内容时,静态内容就被缓存在反向代理服务器上,其他用户请求进来时,就可以直接返回,减轻web服务器负载压力。
5、NIO模型(是在Linux还是Windows系统下,Windows建议用AIO,Linux系统下AIO的底层也是基于epoll多路复用,差别不大,LF的区别)
6、线程池(根据线程池处理不同性质的任务,要有不同性质的线程池,IO密集型,CPU*2。CPU密集型,CPU+1.多生产者多消费这模型)线程池还需要考虑:a.先设置一个最大线程数量和最小线程数量,进行性能评估,压测。b.线程池阻塞队列的大小要有界,否则服务器压力过大。c.须考虑线程池的失败策略,失败后的补偿。d.后台批处理服务须与线上面向用户的服务进行分离。
7、阻塞队列,因为NIO第二个阶段会引起用户线程的阻塞,比如可能等待JDBC连接数据库,因此在这里用一个阻塞队列,线程把请求放到阻塞队列里面,这个线程就可以回归线程池,处理别的事情了。是一个生产者消费者模型
8、建一个数据库连接池,主要是为了减少资源的消耗、减少延迟。
9、数据存储部分,1)根据实际情况设置索引和优化SQL语句。2)幂等、乐观、悲观。3)防止SQL注入攻击。4)一个事务当中操作不要过多,可能会阻塞,进而累积造成数据库的故障。5)数据量太大,查询的时间利用limit关键字进行分页处理,防止结果集太大,让应用OOM。
10、使用缓存,减少数据库的访问次数,提高并发量。1)缓存的结构,LRU,链表(集合类存放超时对象),大小,时间。2)核心业务和非核心业务进行分离,减少相互影响的可能性,不要使用共享缓存。3)不常用的数据不要使用缓存。4)夜间查询一天之类搜索频率比较高的词汇,结合AI进行预测,预测的结果预先放到缓存里面。5)考虑分布式缓存数据库:Redis、memcached,防止本地缓存内存溢出。Redis的主从同步,读写分离、负载均衡。主从+一级二级缓存+哨兵。哨兵是Redis 的高可用性解决方案:由一个或多个哨兵实例 组成的哨兵 系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器。
11、主从有瓶颈,会有延迟、主服务器压力过大。考虑集群、分库分表。考虑用一致性哈希算法实现分布式缓存数据库。数据迁移量小,引入虚拟节点、防止数据倾斜。
12、 若有重复数据,布隆过滤器去重。
13、数据库存储文件名之类的,服务器保存实际的数据。
保持数据一致性的方法:1. 消息队列 2. 用同一个数据库,A.B,C用同一个数据库。 3。 用Redis缓存,把一些数据放到缓存。