【踩坑实录】生产上遇到的并发问题总结

生产上遇到很多并发问题,有很多是在编码阶段就可以避免的,总结一些需要考虑的要点如下:

  1. 使用并发的常见场景为针对大数据量遍历处理,考虑性能,采用并发处理。这是CPU密集型任务场景,同时出现多个任务时,性能不见得最优。
  2. 并发也有开销,不建议无脑并发。并发后堆栈会丢失,不方便排查问题。
  3. 异步开发模式具有传染性,比如使用可回调 Future 后,如果想要避免阻塞问题,需要使用map、flatMap语义。折中的方法是参考结构化并发,在必要位置等待,获取结果后清理资源。
  4. 需要注意副作用,尽量不要使用副作用。尽量不要修改共享的内容,比如本地缓存。
  5. 使用线程安全类 + 原子方法, ConcurrentHashMap 和 HashMap 相比,性能差别不大,而且内存占用基本一致,很多情况下可以直接替换。灵活使用 merge、computeIfAbsent 等方法,比如需要择优的场景,不需要重复写写命令式的逻辑。
  6. 考虑单次加载实现
  7. ConcurentHashMap 高并发时,可能有阻塞等待同一个桶位的问题,必须指定初始大小。
  8. 考虑线程池阻塞队列消费速度,防止某些捣蛋线程。
  9. 考虑处理拒绝任务异常,设计 fallback 策略。
  10. 并发超时或者任务取消时很容易出现线程泄露。
  11. 监控并发收益。
  12. 监控阻塞线程,防止惊群效应。
相关推荐
青云计划9 小时前
知光项目知文发布模块
java·后端·spring·mybatis
赶路人儿9 小时前
Jsoniter(java版本)使用介绍
java·开发语言
Victor3569 小时前
MongoDB(9)什么是MongoDB的副本集(Replica Set)?
后端
Victor3569 小时前
MongoDB(8)什么是聚合(Aggregation)?
后端
探路者继续奋斗9 小时前
IDD意图驱动开发之意图规格说明书
java·规格说明书·开发规范·意图驱动开发·idd
消失的旧时光-194310 小时前
第十九课:为什么要引入消息队列?——异步系统设计思想
java·开发语言
yeyeye11110 小时前
Spring Cloud Data Flow 简介
后端·spring·spring cloud
A懿轩A10 小时前
【Java 基础编程】Java 面向对象入门:类与对象、构造器、this 关键字,小白也能写 OOP
java·开发语言
SQL必知必会11 小时前
SQL 窗口帧:ROWS vs RANGE 深度解析
数据库·sql·性能优化
Tony Bai11 小时前
告别 Flaky Tests:Go 官方拟引入 testing/nettest,重塑内存网络测试标准
开发语言·网络·后端·golang·php