背景
最近有个系统多中心上线,网络管理员监控到,微服务集群到公共数据库的跨中心网络流量飙到特别高。通过日志发现,存在大量的字典数据请求(每个用户1M的字典数据,各种字典……)。
由于字典数据的微服务没做缓存,直接把请求淦到数据库了,而微服务对公共数据库主库的访问是跨中心的,所以大量的重复的字典数据占用了宝贵的带宽(跨中心的带宽很有限,这个是基础设施规划的问题,一时半会解决不了的)。
箭已经射出去了,不可能现场改代码。所以在Nginx上临时做了proxy_cache来把脖子上的刀挪开。
操作
查看日志发现,获取字典数据的URL是POST请求,故需要做对POST请求进行缓存。
- 配置nginx.conf
http {
proxy_cache_path dict_temp levels=1:2 keys_zone=dict_cache:1024m inactive=1h max_size=2g;
# 其他配置
# .......
}
location /dict {
proxy_cache dict_cache;
proxy_cache_valid 200 60s;
proxy_cache_methods POST;
proxy_cache_use_stale updating;
proxy_cache_key "$request_uri|$request_body";
proxy_ignore_headers Cache-Control Expires;
# 其他配置
# .........
}
- 热部署
sbin/nginx -s reload
效果
从300M跨中心带宽占用,降低到了10M跨中心带宽占用。
后话
最终,还需要把缓存的刷新放回到微服务应用层,最坏的情况,有大量的用户会看到60s的旧数据。