「这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战」
- 队列
• 采用队列是解决高并发大流量的利器
• 队列的作用就是:异步处理/流量削峰/系统解耦
• 异步处理是使用队列的一个主要原因,比如注册成功了,发优惠券/送积分/送红包/发短信/发邮件等操作都可以异步处理
• 使用队列流量削峰,比如并发下单、秒杀等,可以考虑使用队列将请求暂时入队,通过队列的方式将流量削平,变成平缓请求进行处理,避免应用系统因瞬间的巨大压力而压垮
• 使用队列实现系统解耦,比如支付成功了,发消息通知物流系统,发票系统,库存系统等,而无需直接调用这些系统;
• 队列应用场景
不是所有的处理都必须要实时处理;
不是所有的请求都必须要实时告诉用户结果;
不是所有的请求都必须100%一次性处理成功;
不知道哪个系统需要我的协助来实现它的业务处理,保证最终一致性,不需要强一致性。
常见的消息队列产品:ActiveMQ/RabbitMQ/RocketMQ/kafka
• ActiveMQ是jms规范下的一个老牌的成熟的消息中间件/消息服务器
• RabbitMQ/RocketMQ 数据可靠性极好,性能也非常优秀,在一些金融领域、电商领域使用很广泛;RocketMQ是阿里巴巴的;
• kafka主要运用在大数据领域,用于对数据的分析,日志的分析等处理,它有可能产生消息的丢失问题,它追求性能,性能极好,不追求数据的可靠性
- 池化
在实际开发中,我们经常会采用一些池化技术,减少资源消耗,提升系统性能。
⑴ 对象池
通过复用对象,减少对象创建和垃圾收集器回收对象的资源开销;
可以采用commons-pool2实现;
实际项目采用对象池并不常见,主要在开发框架或组件的时候会采用。
⑵ 数据库连接池
Druid/DBCP/C3P0/BoneCP
⑶ Redis连接池
JedisPool(内部基于commons-pool2 实现)
⑷ HttpClient连接池
核心实现类:PoolingClientConnectionManager
⑸ 线程池
Java提供java.util.concurrent包可以实现线程池
Executors.newFixedThreadPool(8);线程数量固定
Executors.newSingleThreadExecutor();只有一个线程,避免关闭情况
Executors.newCachedThreadPool();可以自动扩容
Executors.newScheduledThreadPool(10);每隔多久执行
- 优化
⑴ JVM优化
设置JVM参数
-server -Xmx4g -Xms4g -Xmn256m
-XX:PermSize=128m
-Xss256k
-XX:+DisableExplicitGC
-XX:+UseConcMarkSweepGC
-XX:+CMSParallelRemarkEnabled
-XX:+UseCMSCompactAtFullCollection
-XX:LargePageSizeInBytes=128m
1 | ruby复制代码-server VM有两种运行模式Server与Client,两种模式的区别在于,Client模式启动速度较快,Server模式启动较慢;但是启动进入稳定期长期运行之后Server模式的程序运行速度比Client要快很多; |
⑵ 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
本文转载自: 掘金