Java高并发解决方案最全最详细总结(三)

「这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战

  1. 队列

• 采用队列是解决高并发大流量的利器

• 队列的作用就是:异步处理/流量削峰/系统解耦

• 异步处理是使用队列的一个主要原因,比如注册成功了,发优惠券/送积分/送红包/发短信/发邮件等操作都可以异步处理

• 使用队列流量削峰,比如并发下单、秒杀等,可以考虑使用队列将请求暂时入队,通过队列的方式将流量削平,变成平缓请求进行处理,避免应用系统因瞬间的巨大压力而压垮

• 使用队列实现系统解耦,比如支付成功了,发消息通知物流系统,发票系统,库存系统等,而无需直接调用这些系统;

• 队列应用场景

不是所有的处理都必须要实时处理;

不是所有的请求都必须要实时告诉用户结果;

不是所有的请求都必须100%一次性处理成功;

不知道哪个系统需要我的协助来实现它的业务处理,保证最终一致性,不需要强一致性。

常见的消息队列产品:ActiveMQ/RabbitMQ/RocketMQ/kafka

• ActiveMQ是jms规范下的一个老牌的成熟的消息中间件/消息服务器

• RabbitMQ/RocketMQ 数据可靠性极好,性能也非常优秀,在一些金融领域、电商领域使用很广泛;RocketMQ是阿里巴巴的;

• kafka主要运用在大数据领域,用于对数据的分析,日志的分析等处理,它有可能产生消息的丢失问题,它追求性能,性能极好,不追求数据的可靠性

  1. 池化

在实际开发中,我们经常会采用一些池化技术,减少资源消耗,提升系统性能。

⑴ 对象池

通过复用对象,减少对象创建和垃圾收集器回收对象的资源开销;

可以采用commons-pool2实现;

实际项目采用对象池并不常见,主要在开发框架或组件的时候会采用。

⑵ 数据库连接池

Druid/DBCP/C3P0/BoneCP

⑶ Redis连接池

JedisPool(内部基于commons-pool2 实现)

⑷ HttpClient连接池

核心实现类:PoolingClientConnectionManager

hc.apache.org/httpcompone…

⑸ 线程池

Java提供java.util.concurrent包可以实现线程池

Executors.newFixedThreadPool(8);线程数量固定

Executors.newSingleThreadExecutor();只有一个线程,避免关闭情况

Executors.newCachedThreadPool();可以自动扩容

Executors.newScheduledThreadPool(10);每隔多久执行

  1. 优化

⑴ JVM优化

设置JVM参数

-server -Xmx4g -Xms4g -Xmn256m

-XX:PermSize=128m

-Xss256k

-XX:+DisableExplicitGC

-XX:+UseConcMarkSweepGC

-XX:+CMSParallelRemarkEnabled

-XX:+UseCMSCompactAtFullCollection

-XX:LargePageSizeInBytes=128m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ruby复制代码-server VM有两种运行模式Server与Client,两种模式的区别在于,Client模式启动速度较快,Server模式启动较慢;但是启动进入稳定期长期运行之后Server模式的程序运行速度比Client要快很多;
-Xmx2g 最大堆大小
-Xms2g 初始堆大小
-Xmn256m 堆中年轻代大小;
-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4.
-Xss 每个线程的Stack大小
-XX:+DisableExplicitGC,这个参数作用是禁止代码中显示调用GC。代码如何显示调用GC呢,通过System.gc()函数调用。如果加上了这个JVM启动参数,那么代码中调用System.gc()没有任何效果,相当于是没有这行代码一样。
-XX:+UseConcMarkSweepGC 并发标记清除(CMS)收集器,CMS收集器也被称为短暂停顿并发收集器;
-XX:+CMSParallelRemarkEnabled 降低标记停顿;
-XX:+UseCMSCompactAtFullCollection:使用并发收集器时,开启对年老代的压缩.
-XX:LargePageSizeInBytes 指定 Java heap 的分页页面大小
-XX:+UseFastAccessorMethods 原始类型的快速优化
-XX:+UseCMSInitiatingOccupancyOnly 使用手动定义的初始化定义开始CMS收集
-XX:CMSInitiatingOccupancyFraction 使用cms作为垃圾回收使用70%后开始CMS收集;

⑵ Tomcat优化

• 设置JVM参数,可以参考JVM优化参数

在tomcat的bin目录下的catalina.sh中设置jvm参数:

JAVA_OPTS=”-server -XX:+PrintGCDetails -Xmx4g -Xms4g -Xmn256m

-XX:PermSize=128m

-Xss256k

-XX:+DisableExplicitGC

-XX:+UseConcMarkSweepGC

-XX:+CMSParallelRemarkEnabled

-XX:+UseCMSCompactAtFullCollection

-XX:LargePageSizeInBytes=128m

-XX:+UseFastAccessorMethods

-XX:+UseCMSInitiatingOccupancyOnly

-XX:CMSInitiatingOccupancyFraction=70”

• 设置tomcat的线程池大小

• 设置 IO 模式

• 配置 APR

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%