高并发系统如何设计

news/2024/7/9 17:17:23 标签: 数据库, epoll, 数据结构与算法

高并发系统如何设计

一、总结

一句话总结:

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缓存,把一些数据放到缓存。

 

转载于:https://www.cnblogs.com/Renyi-Fan/p/10907450.html


http://www.niftyadmin.cn/n/1532083.html

相关文章

微信接口调用'updateTimelineShareData','updateAppMessageShareData' 的踩坑记录

6月份新版微信客户端发布后,用户从微信内的网页分享消息给微信好友,以及分享到朋友圈,开发者将无法获知用户是否分享完成。具体调整点为:(1)分享接口调用后,不再返回用户是否分享完成事件&#…

Ubuntu 配置Java+Tomcat

一、配置Java1.下载 https://www.oracle.com/technetwork/java/javase/downloads/index.html 下载后上传,自行解压 CSDN下载->在本地解压后上传 2.在Ubuntu中配置环境变量 vim /etc/profile 在里面的最后输入 export JAVA_HOME/opt/Java/jdk-12.0.1 export CLASS…

关于SOA架构设计的案例分析

这周周一老师讲了SOA软件结构设计,下面对SOA软件架构设计做一些案例分析。 首先,SOA是一种面向企业级服务的系统架构,简单来说,SOA就是一种进行系统开发的新的体系架构,在基于SOA架构的系统中,具体应用程序…

【AtCoder】AGC001

AGC001 A - BBQ Easy 从第\(2n - 1\)个隔一个加一下加到1即可 #include <bits/stdc.h> #define fi first #define se second #define pii pair<int,int> #define mp make_pair #define pb push_back #define space putchar( ) #define enter putchar(\n) #define e…

32-理解容器之间的连通性

两个 busybox 容器都挂在 my_net2 上&#xff0c;应该能够互通&#xff0c;我们验证一下&#xff1a; 可见同一网络中的容器、网关之间都是可以通信的。 my_net2 与默认 bridge 网络能通信吗&#xff1f; 从拓扑图可知&#xff0c;两个网络属于不同的网桥&#xff0c;应该不能通…

Exp9 Web安全基础 20164314

一、实践目标 理解常用网络攻击技术的基本原理&#xff0c;包括(SQL,XSS,CSRF)&#xff1b; 在Webgoat实践下相关实验。 二、实践过程 准备工作&#xff1a; 1.环境配置&#xff1a; 下好jar包然后放在根目录下 使用命令 java -jar webgoat-container-7.0.1-war-exec.jar 就可以…

mariadb mysql -u root -p 显示Access denied解决办法

问题 在ubuntu下执行mysql -u root -p显示&#xff1a; Access denied for user rootlocalhost (using password: YES) 应该算是经典问题&#xff0c;stackoverflow上有很多高票回答&#xff0c;这样报错的原因应该是密码不对。解决方式无外乎是通过skip-grant-tables绕开密码登…

Shiro自定义realm实现密码验证及登录、密码加密注册、修改密码的验证

Shiro自定义realm实现密码验证及登录、密码加密注册、修改密码的验证 一&#xff1a;先从登录开始&#xff0c;直接看代码 RequestMapping(value"dologin",method {RequestMethod.GET, RequestMethod.POST},produces"text/html;charsetUTF-8")ResponseBod…