服务预热问题
1.jvm刚启动的时候,如果不先预热的话,可能会导致响应超时的问题
预热的方法:比如redis线程池,可以提前创建连接,比如热点数据可以提前查询一遍,丢入redis中。
(28条消息) 服务预热问题_Java全栈研发大联盟的博客-CSDN博客_服务预热
所谓服务预热,就是在服务启动完成到对外提供服务之前,针对特定场景提供一些初始化准备操作,比如线程池预热、缓存预热、数据库预热、web预热和jvm预热等等,需要注意的是,预热操作需要在应用真正对外提供服务之前完成,那么我们就可以基于框架的事件或者扩展点来完成这个操作,比如ContextRefreshedEvent和ApplicationReadyEvent事件,InitializingBean和ApplicationContextAware扩展点,以及@PostConstruct和init方法等等。
这里说的也是这些扩展点的使用场景。当然也可以让运维同学来处理预热的事情,预热之后在将服务放入服务列表中。
以下是一些预热方案:
(28条消息) JVM预热方案_Bad Request 400的博客-CSDN博客_jvm预热
预热是指,在jvm启动后,先不提供给调用方正常的流量,而是利用技术手段,先用小流量将服务进行warmup,直到能够按照合理的响应时间提供服务为止。
预热方案有目前以下手段:
1、通过流量控制来进行预热:
1)利用网关的流量控制功能,按照新服务上线时间,给与不同的访问权重,使得服务能够逐渐达到正常访问的热度。
2)使用sentinel等组件进行warmup限流,在服务上线的时候,将过高的流量直接拦截掉。
3)spring的ribbon组件策略改造,与网关流量控制策略相同。
2、在服务启动后,可以正常访问前,让服务自己预热
1)服务开发者进行编码,启动后,初始化模块自己遍历一遍重要的访问接口
2)利用测试工具组件(Java Microbenchmark Harness(JMH)),启动后遍历访问接口
3)使用阿里的开源项目龙井,替换jdk,在服务启动时自动加载该加载的类。阿里龙井使用手册
3、发布系统中进行配置访问url列表,由发布系统预热
每个服务的开发者自己进行评估,列出需要预热的url,将这个url列表存入发布系统,由发布系统调用health之前,由curl调用一遍。