动力节点首页 全国咨询热线:400-8080-105

绑定手机号,登录
手机号

验证码

微信登录
手机号登录
手机号

验证码

30天自动登录
微信登录与注册
微信扫码登录与注册

扫码关注微信公众号完成登录与注册
手机号登录
首页 > 文章

高并发系统的设计

08-06 10:35 412浏览
举报 T字号
  • 大字
  • 中字
  • 小字

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

动力节点在线课程涵盖零基础入门,高级进阶,在职提升三大主力内容,覆盖Java从入门到就业提升的全体系学习内容。全部Java视频教程免费观看,相关学习资料免费下载!对于火爆技术,每周一定时更新!如果想了解更多相关技术,可以到动力节点在线免费观看Java高并发视频教程哦!

0人推荐
共同学习,写下你的评论
0条评论
代码小兵345
程序员代码小兵345

44篇文章贡献168626字

相关课程 更多>

作者相关文章更多>

推荐相关文章更多>

Java初学者学习方法

代码小兵64503-29 11:46

两道经典算法问题

代码小兵51603-29 13:18

Java中模拟高并发的方法

代码小兵87208-06 11:36

Java程序员必备的一些流程图

代码小兵64503-29 15:27

Java接口限流的实现方法

代码小兵57603-29 17:52

发评论

举报

0/150

取消