主题
面试速答(先看这里)
**一句话结论:**因为如果是网络和流量问题,要么就是会持续一会,要么就是所有机器都会存在。
60秒标准回答:
在服务发布过程中,应用刚刚启动好之后负载很高,过一会就恢复了,因为负载高之后很快就恢复了,那么一般来说可以排除代码问题。再根据观察看看是不是每台机器都有这种情况,以及是不是每一批启动的时候也都存在,那么就可以排除网络问题以及流量问题
因为如果是网络和流量问题,要么就是会持续一会,要么就是所有机器都会存在。不太会说只有刚刚发布的机器才有这个问题
那么,这个问题一般来说可能是以下几个原因
**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点
回答主线:
- **要点1:**那么,这个问题一般来说可能是以下几个原因。
- **要点2:**上面的两个问题,是比较常见的会导致这个问题的情况。
- **要点3:**1、缓存预热 ,可以在应用发布过程中,在Spring启动时就对缓存进行预热。
- **要点4:**2、小流量切流 ,在应用发布的时候,可以针对刚刚启动的机器进行小流量切流,比如先给10%流量,让他进行缓存预热以及JIT优化的处理,当持续一段时间后,再逐步放开流量。
- **要点5:**3、分更多的批次 ,和上面的情况类似,只不过是通过分更多批次让每次启动的机器更少一点,让流量更加平均一些,减少缓存击穿、JIT优化带来的影响。
**记忆锚点:**JIT → 第一批发完后负载很高后面恢复正常 → 第一批请求会触发缓存 → 导致的资源抢占和缓存 → 服务发布分10批 → 启动时就对缓存
关键取舍:
- 避免启动后预热导致的资源抢占和缓存击穿等问题。
易错提醒:
- 避免启动后预热导致的资源抢占和缓存击穿等问题。
- 让流量不要那么大。
加分表达:
- 因为如果是网络和流量问题,要么就是会持续一会,要么就是所有机器都会存在。
- JIT优化 :刚上线的代码会进行JIT优化,进行热点代码检测以及字节码生成。
- 2、小流量切流 ,在应用发布的时候,可以针对刚刚启动的机器进行小流量切流,比如先给10%流量,让他进行缓存预热以及JIT优化的处理,当持续一段时间后,再逐步放开流量。
追问准备:
- 围绕「JIT」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「第一批发完后负载很高后面恢复正常」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「第一批请求会触发缓存」:底层原理是什么?使用时有哪些边界和常见坑?
- 如果线上出现异常,你会如何定位、验证并规避?
典型回答
在服务发布过程中,应用刚刚启动好之后负载很高,过一会就恢复了,因为负载高之后很快就恢复了,那么一般来说可以排除代码问题。再根据观察看看是不是每台机器都有这种情况,以及是不是每一批启动的时候也都存在,那么就可以排除网络问题以及流量问题。
因为如果是网络和流量问题,要么就是会持续一会,要么就是所有机器都会存在。不太会说只有刚刚发布的机器才有这个问题。
那么,这个问题一般来说可能是以下几个原因。
缓存冷启动:第一批请求会触发缓存的冷启动,导致缓存未命中率高。
JIT优化:刚上线的代码会进行JIT优化,进行热点代码检测以及字节码生成。
上面的两个问题,是比较常见的会导致这个问题的情况。那么如何解决呢?
1、缓存预热,可以在应用发布过程中,在Spring启动时就对缓存进行预热。避免启动后预热导致的资源抢占和缓存击穿等问题。
2、小流量切流,在应用发布的时候,可以针对刚刚启动的机器进行小流量切流,比如先给10%流量,让他进行缓存预热以及JIT优化的处理,当持续一段时间后,再逐步放开流量。
3、分更多的批次,和上面的情况类似,只不过是通过分更多批次让每次启动的机器更少一点,让流量更加平均一些,减少缓存击穿、JIT优化带来的影响。
4、提前扩容,有的公司也会这么干,比如我有50台机器,分10批,每一次就是5台。那么他可以先根据分批情况,扩容出来5台,就是一共55台,这样就能保证发布过程中线上还是至少同时有50台机器在对外提供服务的。也能减少服务器的压力。
5、限流,也可以在应用发布过中,针对这些刚刚启动的应用做限流。让流量不要那么大。