在服务发布过程中,应用刚刚启动好之后负载很高,过一会就恢复了,因为负载高之后很快就恢复了,那么一般来说可以排除代码问题。再根据观察看看是不是每台机器都有这种情况,以及是不是每一批启动的时候也都存在,那么就可以排除网络问题以及流量问题。
因为如果是网络和流量问题,要么就是会持续一会,要么就是所有机器都会存在。不太会说只有刚刚发布的机器才有这个问题。
那么,这个问题一般来说可能是以下几个原因。
缓存冷启动:第一批请求会触发缓存的冷启动,导致缓存未命中率高。
JIT优化:刚上线的代码会进行JIT优化,进行热点代码检测以及字节码生成。
上面的两个问题,是比较常见的会导致这个问题的情况。那么如何解决呢?
1、缓存预热,可以在应用发布过程中,在Spring启动时就对缓存进行预热。避免启动后预热导致的资源抢占和缓存击穿等问题。
2、小流量切流,在应用发布的时候,可以针对刚刚启动的机器进行小流量切流,比如先给10%流量,让他进行缓存预热以及JIT优化的处理,当持续一段时间后,再逐步放开流量。
3、分更多的批次,和上面的情况类似,只不过是通过分更多批次让每次启动的机器更少一点,让流量更加平均一些,减少缓存击穿、JIT优化带来的影响。
4、提前扩容,有的公司也会这么干,比如我有50台机器,分10批,每一次就是5台。那么他可以先根据分批情况,扩容出来5台,就是一共55台,这样就能保证发布过程中线上还是至少同时有50台机器在对外提供服务的。也能减少服务器的压力。
5、限流,也可以在应用发布过中,针对这些刚刚启动的应用做限流。让流量不要那么大。