0. 哪里来的问题
当新服务上线的时候,是不是会莫名的提示你服务卡了?
运维告诉你:我们是平滑启动的,是确保服务已经可以打印出status页的时候才会对外提供服务的,并且还保持了一定的pod数量,不可能会卡的。不存在暴力kill的情况。
然后你懵逼的不知道发生了啥,觉得为啥不够平滑。
1. 让我们来分析下这个流程
运维接到通知要上线服务,开始启动服务,检测服务,状态OK,对外服务,nginx流量导过来。当老的pod没有流量的时候直接下掉。多个服务重复操作,直到全部升级完毕,结束。
2. 让我们来分析下这个问题
因为卡的时间发生在我们升级期间,不确定是哪里的问题,并且不是每次都会出现。很难发现是哪里的问题。但是我们还是会发现问题更多时候发生在大流量发布期间,【逻辑上没有那个运维同意在高流量的时候发布项目】。低流量问题就少的多。
3. 猜测原因
突然的大流量,是不是你的服务有冷启动问题,有缓存刚开始加载的慢,突然的并发,缓存还没都加载完,假如用的全局缓存就不用担心了,因为缓存还在正常访问。
- spring中有个特点,首次请求的时候,接口比较慢,然后就很快,因为使用了本地的容器缓存。的确很是影响。
- 新业务使用了新的缓存,刚上线就有大的流量,因为还没有缓存,都去拼命的请求数据库,数据库就扛不住。【缓存踩踏】
4. 一些处理的想法
是不是可以设置一个启动时间,在启动时间内,压力按照比例,逐渐分配,比如设置启动时间100s, 每一秒释放1%的压力,直到最后完成100的压力,这样能缓解首次接口大并发的问题。动态权重。
5.后记
也许还有其他问题,还在等解决。。。