门户网站建设报告哦,谁给推荐一个免费的好网站,景观园林设计公司,可以把网站建设在云主机上吗高并发核心知识点完整总结一、高并发的核心本质#xff1a;核心矛盾 高并发所有问题的根源#xff0c;都源于三组核心矛盾#xff0c;这也是我们所有讨论的出发点#xff1a;资源复用与共享资源竞争的矛盾#xff1a;资源复用的核心是减少资源创建、销毁的开销#xff0c…高并发核心知识点完整总结一、高并发的核心本质核心矛盾高并发所有问题的根源都源于三组核心矛盾这也是我们所有讨论的出发点资源复用与共享资源竞争的矛盾资源复用的核心是减少资源创建、销毁的开销提升利用效率但共享资源会引发多线程竞争导致数据不一致等问题线程管理与处理效率的矛盾线程是高并发的最小执行单元合理的线程管理能提升请求处理能力但线程过多会导致上下文切换开销激增甚至引发资源耗尽同步强一致性与异步高性能的矛盾核心业务需要同步保证数据一致和流程可靠但同步会阻塞主线程降低吞吐量非核心业务可通过异步提升性能但需解决可靠性兜底问题。所有高并发相关的工具、方案锁、无锁、线程池、缓存、异步、MQ等本质都是在这三组矛盾中寻找最优平衡兼顾效率与安全。二、高并发的底层根基JVM内存模型与线程机制高并发的所有上层实现都依赖底层的JVM内存模型JMM和线程机制这是最基础的知识点也是后续所有工具的底层支撑JVM内存模型定义了主内存、工作内存的划分以及volatile关键字的可见性、有序性保障原子性的实现基础是多线程安全的底层逻辑支撑线程机制线程是高并发的最小执行单元线程的状态RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、上下文切换、阻塞与唤醒机制直接影响系统性能开销底层关联后续我们讨论的锁、无锁、线程池、并发集合等工具底层都依赖JMM的内存可见性、原子性保障以及CPU指令级优化没有底层根基上层并发工具无法实现安全高效的运行。三、高并发的衡量指标排查问题的前提无论处理单体高并发还是分布式高并发首先需要明确衡量高并发的核心指标通过指标定位瓶颈这是所有排查工作的第一步响应时间RT衡量请求从发起至返回结果的耗时直接影响用户体验吞吐量QPS/TPS单位时间内处理的请求数量是高并发性能的核心衡量标准线程状态通过查看线程的RUNNABLE、BLOCKED、WAITING等状态判断线程是否存在阻塞、闲置等问题辅助指标CPU利用率、内存占用、IO读写速度、GC频率及耗时这些指标能辅助定位瓶颈如CPU过高可能是CPU密集型任务处理不当内存上涨可能是队列堆积导致OOM。四、高并发常见问题及解决方案结合我们的讨论高并发场景下最常见的问题主要集中在缓存、死锁、线程耗尽、共享数据不一致四大类每类问题都有明确的成因和对应解决方案同时包含我们讨论的所有细节一缓存相关问题高并发核心性能优化手段缓存的核心本质是“空间换时间”通过复用已计算、已获取的数据减少对底层资源如数据库的重复访问从而提升性能我们讨论的缓存相关细节如下缓存的常见类型1本地缓存适用于单服务内的数据复用减少服务内重复计算或本地资源访问2分布式缓存适用于分布式高并发场景最常用的是Redis用于分担集群访问压力、存储海量数据。Redis的真实场景选型重点讨论细节1Redis集群在高并发、大数据量的真实场景下使用更多核心优势是可横向扩展节点既能分担读写压力又能存储更多数据适配高并发、海量数据的业务需求2Redis哨兵主要用于解决主从复制下的故障自动切换更适合数据量不大但需要保证高可用的场景高并发、大数据量场景下不如集群适用。缓存的三大经典问题核心细节1缓存穿透查询不存在的数据每次请求都会穿透缓存直接访问数据库导致数据库压力增大2缓存击穿热点Key过期大量请求同时穿透缓存集中访问数据库导致数据库瞬时压力激增3缓存雪崩大量Key同时过期导致所有请求都穿透缓存访问数据库直接压垮数据库。缓存问题的兜底方案结合业务场景可采用互斥锁、逻辑过期、限流、降级、缓存预热等方式减少缓存问题对系统的影响。二死锁问题死锁是多线程共享资源时的典型问题我们讨论的核心细节如下死锁的成因多个线程循环等待对方持有的锁资源比如线程A持有锁1等待线程B持有的锁2线程B持有锁2等待线程A持有的锁1双方陷入无限等待死锁的表现线程状态长时间处于BLOCKED状态CPU利用率较低但业务完全卡死无法正常处理请求死锁的解决思路统一多线程的加锁顺序、使用超时锁避免无限等待、避免在锁中嵌套锁从根源上减少死锁的产生。三线程耗尽问题线程耗尽的核心原因是线程管理不当导致系统资源被耗尽我们讨论的细节如下常见成因1创建过多线程没有使用线程池直接频繁创建线程导致线程数量远超系统承载能力上下文切换开销激增2线程池配置不当比如使用无界队列搭配高核心线程数导致任务大量堆积撑爆内存或者线程数设置不合理导致线程闲置或耗尽3IO阻塞大量线程因IO等待如数据库查询、网络请求处于WAITING状态新请求无法获取可用线程导致线程耗尽。解决思路使用自定义线程池合理配置线程数、队列类型和拒绝策略避免无限制创建线程同时优化IO操作减少线程阻塞时间。四共享数据不一致问题共享数据不一致是多线程并发的核心安全问题源于多线程对共享变量的无序修改我们讨论的解决方案如下锁机制使用synchronized、ReentrantLock、读写锁等保证多线程对共享资源的有序访问避免并发修改无锁机制使用CAS操作、Atomic原子类通过CPU指令级优化实现无锁情况下的原子操作减少锁带来的性能开销线程安全集合使用ConcurrentHashMap、CopyOnWriteArrayList等并发集合替代非线程安全的集合如HashMap、ArrayList避免集合操作中的数据不一致线程本地变量使用ThreadLocal将共享变量私有化到每个线程避免多线程共享从根源上解决数据不一致问题。补充细节这些解决方案并非孤立使用需结合业务场景组合选择比如核心业务用锁保证强一致非核心业务用无锁机制提升性能。五、高并发的核心综合体线程池自定义 底层原理 选型我们一致认为线程池是高并发所有机制的集大成体现它融合了之前讨论的锁机制、无锁机制、JVM线程管理等所有底层知识点同时直接决定高并发场景下的性能和稳定性所有讨论的细节如下一线程池的底层核心逻辑线程池的底层设计直接融合了我们之前讨论的核心知识点锁机制使用ReentrantLock控制任务队列的并发访问保证多线程情况下任务队列的安全无锁机制使用CAS操作维护线程的状态如线程的创建、销毁、空闲状态切换减少锁带来的性能开销JVM线程管理线程池对线程进行统一的创建、复用、销毁避免频繁创建线程带来的JVM资源消耗同时控制线程数量减少上下文切换。二线程池的核心三要素选型关键线程池的选型本质就是围绕核心三要素进行配置每一个要素都需结合业务场景所有细节如下核心线程数 最大线程数核心是根据任务类型CPU密集型、IO密集型确定这是我们重点讨论的内容任务队列用于缓冲等待执行的任务队列类型的选择直接影响系统稳定性是否会OOM拒绝策略对应业务对任务丢失的容忍度不同业务场景选择不同的拒绝策略。三CPU密集型任务的线程池配置重点细节CPU密集型任务的特点纯计算逻辑CPU利用率高几乎不存在IO等待但可能存在极少量IO如读取配置文件对应的线程池配置细节如下线程数配置推荐核心线程数 CPU核心数 1核心原因如下1理论上核心线程数等于CPU核心数时能最大化利用CPU资源避免CPU空闲21的目的应对CPU密集型任务中可能存在的少量IO等待如临时读取配置、GC暂停等当某个线程因少量IO临时阻塞时额外的1个线程能立刻占用CPU避免CPU空转同时不会因线程过多导致上下文切换开销激增3补充如果CPU密集型任务完全没有IO操作核心线程数等于CPU核心数即可但实际场景中即使是纯计算任务也可能存在极少量IO因此1是更稳妥的选择。队列选型推荐使用无界队列或大的有界队列原因如下1CPU密集型任务执行速度快任务在队列中停留的时间极短不会出现长期积压的情况2即使队列较大也不会像IO密集型任务那样因任务长期驻留队列导致内存溢出OOM3队列的核心作用是缓冲任务让核心线程一直处于忙碌状态最大化利用CPU资源。四IO密集型任务的线程池配置重点细节IO密集型任务的特点存在大量IO等待如数据库查询、网络请求、文件读写CPU利用率低对应的线程池配置细节如下线程数配置推荐核心线程数远大于CPU核心数常用配置为CPU核心数 * 2 5核心原因IO密集型任务中线程大部分时间都在等待IO完成此时CPU处于空闲状态多配置线程能让CPU在等待IO的间隙被其他线程利用提升整体吞吐量。队列选型必须使用有界队列原因如下IO密集型任务执行速度慢任务在队列中驻留的时间长如果使用无界队列会导致任务大量堆积最终撑爆内存引发OOM。五拒绝策略的选型对应业务任务容忍度拒绝策略的选择完全取决于业务对任务丢失的容忍度我们讨论的4种拒绝策略及适用场景如下AbortPolicy直接抛出异常适用于核心业务如支付、订单创建任务丢失会导致数据不一致或业务异常抛出异常后可及时报警便于排查处理CallerRunsPolicy由调用者主线程执行任务适用于非核心业务温和兜底不会丢失任务同时不会给系统带来过大压力DiscardOldestPolicy丢弃队列中最老的任务适用于任务时效性强、非核心的场景如日志收集丢弃老任务不会影响业务核心逻辑DiscardPolicy直接丢弃任务适用于对任务丢失完全无影响的场景如埋点统计无需兜底追求最大吞吐量。六线程池的核心注意事项生产环境必须使用自定义线程池禁止使用Executors工具类Executors创建的线程池存在隐患如无界队列导致OOM、线程数无限制等无法适配实际业务场景线程池的参数需结合业务场景动态调整没有固定标准核心是根据任务类型CPU/IO密集、任务重要性、系统资源灵活调整线程数、队列、拒绝策略需监控线程池状态定期查看线程池的线程状态、队列堆积情况及时发现线程耗尽、队列积压等问题避免影响系统稳定性。六、高并发的两大处理模式同步与异步同步与异步是高并发场景下两种核心处理模式我们讨论的核心是“核心业务同步保可靠非核心业务异步提效率”所有细节如下一同步处理——高并发的可靠性基石适用场景核心业务如支付、扣款、库存扣减、订单状态更新等核心目标保证业务流程的完整性和数据一致性确保每一步操作都能得到明确结果一旦中间环节出错能及时终止并回滚避免出现“钱扣了但订单没创建”“库存扣了但支付失败”等数据不一致问题核心优先级安全数据一致 性能吞吐量常用手段结合锁机制、事务、串行校验等确保同步流程的可靠性。二异步处理——高并发的性能优化延伸核心目标提高系统吞吐量和响应速度不阻塞主线程让主线程能快速处理更多请求核心结论异步处理的本质是“让任务在后台执行不阻塞主线程”与任务是CPU密集型还是IO密集型没有本质关联但实际场景中更推荐用于IO密集型任务推荐用于IO密集型任务的原因IO密集型任务存在大量等待时间异步处理能让主线程在等待IO的间隙处理其他请求最大化利用系统资源而CPU密集型任务异步后后台线程仍会占用CPU资源若线程过多会导致上下文切换开销激增反而降低效率补充细节即使是CPU密集型任务也可以使用异步处理但需严格控制线程数避免CPU资源竞争。三异步处理的两种最常用方案重点讨论细节我们一致认为实际项目中异步处理最常用的两种方案是CompletableFuture同一服务内和消息队列MQ跨服务两者的使用场景、注意事项如下1. 同一服务内异步CompletableFuture1适用场景同一服务内的多任务并行、任务编排如一个请求需要并行调用多个本地接口或按顺序执行多个异步任务2核心注意事项必须使用自定义线程池禁止使用默认的ForkJoinPool3默认线程池的问题CompletableFuture默认使用的ForkJoinPool线程数通常与CPU核心数相关适合IO密集型任务但无法根据业务场景灵活调整容易出现线程耗尽或资源浪费4自定义线程池的注意点需根据任务类型IO/CPU密集调整线程数、队列类型和拒绝策略避免线程超队列、线程数设置不合理等问题确保异步任务稳定执行。5补充细节CompletableFuture处理的任务大多数场景下是IO密集型RO如读取数据、接口调用因为IO密集型任务的等待时间长异步能最大化发挥优势。2. 跨服务/跨系统异步消息队列MQ1适用场景跨服务解耦、削峰填谷、异步通知如订单系统向物流系统、库存系统发送消息用户注册后发送短信通知2核心注意事项使用MQ必须解决三大问题否则会引入新的异步风险这是我们重点讨论的细节① 幂等性防止消息重复消费导致数据错误如重复扣减库存、重复发送通知常用解决方案是给每条消息分配唯一ID消费前校验该ID是否已被消费② 顺序性部分业务场景需要保证消息的消费顺序如订单的创建、支付、发货消息需按顺序消费常用解决方案是使用单队列或队列分区有序③ 重试机制 死信队列消息消费失败后不能直接丢弃需设置合理的重试次数和重试间隔若多次重试仍失败将消息转入死信队列避免消息丢失同时便于后续排查修复。四死信队列——异步处理的最终兜底重点细节我们重点讨论了死信队列的本质和作用所有细节如下死信队列的本质死信队列本身就是一个普通的消息队列没有特殊的存储、传输机制只是被标记为“专门接收无法正常处理的消息”本质上与普通队列无区别只是用途特殊死信队列的触发条件消息重试多次失败、消息过期、队列满了满足任一条件消息会被路由到死信队列死信队列的核心作用兜底1数据校对当异步任务出现数据安全问题如数据不一致时可从死信队列中抓取消息与数据库中的数据进行校验比对2故障修复若校验发现数据不一致可对死信队列中的消息进行人工修复然后重新投递确保异步数据的最终一致性3问题排查死信队列中的消息能反映出异步处理中的问题如消费逻辑错误、依赖服务异常便于开发人员排查根因。七、高并发的通用排查思路单体/分布式通用结合我们的讨论无论面对单体高并发还是分布式高并发都有一套通用的排查思路核心是“先区分场景、再看指标、再定位问题、最后解决问题”所有细节如下第一步区分场景排查的前提区分是单体高并发还是分布式高并发单体高并发重点排查本地线程、本地缓存、本地线程池分布式高并发还需排查分布式缓存、MQ、服务间通信等区分是同步核心业务还是异步非核心业务同步业务重点排查锁、数据一致性、线程阻塞异步业务重点排查线程池、MQ、死信队列。第二步查看指标定位瓶颈CPU利用率CPU过高可能是CPU密集型任务线程数过多或存在死循环CPU过低可能是线程阻塞BLOCKED/WAITING线程状态查看线程是否大量处于BLOCKED锁竞争、死锁、WAITINGIO阻塞状态或RUNNABLE状态占比过高CPU密集型任务过载内存与GC内存持续上涨可能是队列积压无界队列、缓存泄漏GC频繁可能是大量对象创建销毁未使用线程池、缓存未回收队列与MQ查看线程池队列是否积压、MQ消息是否堆积判断是否是任务处理速度跟不上请求速度。第三步定位根因结合日志根据指标和线程状态结合日志定位具体问题常见根因包括线程池参数不合理线程数、队列、拒绝策略配置不符合业务场景锁机制使用不当锁粒度太大导致并发低、锁顺序混乱导致死锁缓存问题缓存穿透、击穿、雪崩或缓存与数据库更新顺序错误导致数据不一致MQ问题消息幂等、顺序、重试机制未处理导致消息重复消费、消费顺序错乱、消息丢失IO问题数据库查询慢、网络请求超时导致线程大量阻塞。第四步对应解决方案结合之前的知识点同步场景优化锁机制减小锁粒度、统一加锁顺序、使用无锁机制或线程安全集合、调整缓存策略、优化IO操作确保数据一致和流程可靠异步场景调整自定义线程池参数线程数、队列、拒绝策略、修复MQ的幂等、顺序、重试问题、利用死信队列进行兜底确保异步任务高效、稳定执行。第五步验证与优化解决问题后监控指标和线程状态验证解决方案的有效性同时根据业务变化动态优化参数如线程池、缓存、MQ配置确保系统长期稳定运行。八、总结完整串联所有知识点高并发的知识体系以JVM内存模型和线程机制为底层根基核心矛盾是资源复用与共享竞争、线程管理与处理效率、同步一致与异步高效的平衡从问题层面主要面临缓存问题、死锁、线程耗尽、共享数据不一致四大类问题对应的解决方案包括锁、无锁、线程安全集合、ThreadLocal、缓存、死信队列等线程池是所有机制的集大成者其自定义配置线程数、队列、拒绝策略需结合任务类型CPU/IO密集和业务场景是高并发落地的核心工具同步处理保证核心业务的可靠性异步处理提升非核心业务的吞吐量CompletableFuture用于本地异步MQ用于分布式异步死信队列作为异步的最终兜底排查高并发问题的核心思路是“先区分场景、再看指标、再定位根因、最后解决优化”所有操作都围绕“平衡效率与安全”展开确保系统在高并发场景下既能保证数据一致又能最大化提升吞吐量。