高并发情况下,我们系统是如何支撑大量的请求的?
1、尽量使用缓存技术,
包括用户缓存,信息缓存还有静态页面缓存,多花点内存来做缓存,可以大大减少与数据库的交互次数和 tomcat 执行次数,减少不变的数据重复在 tomcat 和数据库中获取的次数。
2、同步转异步,
对于一些不需要即时结果的操作,可以使用 MQ 消息机制,达到同步转异步的效果,如秒杀系统,正常流程:先点击秒杀,然后往服务器发送请求,在页面等待响应,这样融入大量请求,服务器压力会特别大,搞不好服务器就会宕机。使用 MQ 消息队列实现异步的步骤为: 点击秒杀,返回请稍后查看结果,请求去 MQ 队列中排队,等排队执行完成后返回给用户信息。这样就可以大大减少服务器的压力,提升用户体验度。
3、合并多个同类型请求为一个请求,
使用 SpringCloud 的 Hystrix 技术来实现。在服务提供者提供了返回单个对象和多个对象的接口,并且单个对象的查询并发数很高,服务提供者负载较高的时候,我们就可以使用请求合并来降低服务提供者的负载。
4、数据库方面,
搭建数据库集群,网站一般读的多写的少,可以按照网站的统计数据来找到一个合适的平衡点,来搭建主从数据库服务,可以实现一主多从,或者多主多从,来减轻单个数据库的压力。可以按照每台数据库服务器的硬件条件,合理分配权重,配合 Mycat 达到负载均衡。
5、高质量代码,
合理的使用循环和递归,不要为了速度丢了内存,也不要为内存丢了速度,要看业务场景,来合理使用。减少自动处理逻辑,比如字符串拼接,每次拼接都会创建一个字符串放入常量池,这里可以按照业务场景来使用 StringBuilder 或者 StringBuffer 来进行字符串拼接,能手动处理就手动处理,代码中所有的临时对象,用完之后都赋值为 Null,这样可以减少 GC 的重复排查,效率就会有所提升。所有的资源用完都要回收,如:IO、数据库连接对象等,因为这些资源对 GC 不是特别友好。减少代码调用链,尽量不要让代码调用链超过 10,远程方法调用没事。提供过滤能力,把每个过滤器写的详细一点,把耦合度高的数据放入到同一个过滤器中,如果第一个过滤器没有通过那么后面的过滤器不执行,相对的业务也就不执行了,效率也就提升了。
6、网络优化,
外网转内网,内网转局域网,外网转 VPN。配合公司内的网络运维人员,进行网络网段的切换,尽量让服务器群处于内网,或者局域网中,提供访问速度。服务器之间的通讯如果都是局域网内进行的,那么可想而知,访问速度肯定有所提升。
7、中间件处理
搭建 Tomcat 集群,通过 Nginx 代理 Tomcat 服务器做负载均衡,对每个 Tomcat 的调优,合理设置设置Tomcat 的最大连接数,因为 Tomcat 的默认最大并发数为 200。适当的加大 Tomcat的内存和最多线程数,设置 JVM 的处置大小为服务器可用内存的最大值的 80%。关闭 DNS查询,开启 gzip 压缩。搭建 MQ 集群,高并发的时候一个 MQ 来处理队列根本不够用,这时可以搭建集群来处理。增加 Nginx 的内存,加大 Nginx 缓存数据的范围。服务器操作系统都用 64 位的,因为 32 位的系统最大内存只能有 4G图片服务器分离,搭建 vsftpd 服务器来存储图片数据,通过 Nginx 代理 vsftpd 存放路径就可以直接访问到图片,这样响应到页面的只是超链接,并不是图片,这样页面的响应会得到大大的提升
上一篇: 求职面试中常见的问题---你为什么离职?
下一篇: 职业方向之第一个决定性因素:前途