问题
什么是服务预热,一般出现在 qps 密集的场景,也就是我们说的高并发场景。
例如:一个抢购服务,会在商品开售的时间,或者自动扩容后,QPS 瞬间会从 0 或者极少的一个量级上升到很高的一个量级。
在服务刚启动时,Redis 缓存库一般都是空的、数据库连接池也只会有少量数据库连接。
在这个时候如果有大量请求到达服务端,这时服务端会先去 Redis 中拿缓存数据,拿不到之后会直接穿透到数据库层拿数据,但从数据库拿数据需要有数据库连接,若连接池没有足够的连接,就需要在短时间内创建大量的数据库连接,造成短时间内所有的请求都会穿透到数据库层,对数据库造成压力。
磁盘、CPU、以及服务自身资源占用的表飙升,造成接口响应超时,甚至可能会拖垮数据库服务。并且 CPU 、内存、磁盘资源的突然飙升,又会触发新一轮的扩容,造成循环扩容的问题。
自动预热
要解决这个问题,就要在服务启动后先进行服务预热,再将流量切过来。例如:
- 在程序初始化时,将数据库中的数据先缓存到 Redis 中,
- 同时在数据库连接池中缓存多个数据库连接。
- 若有用到线程池的地方,也可以根据业务需求,提前创建空闲的线程。
在做完这些之后,再将请求切进来,就不会造成上述问题了
请求预热
还有一种方案,适合自动扩容场景。
在服务启动完成后,先切少量的流量过来,由这些请求完成数据的预热工作,然后在逐步增加请求的量级。