背景
最近有個(gè)系統(tǒng)多中心上線(xiàn),網(wǎng)絡(luò)管理員監(jiān)控到味赃,微服務(wù)集群到公共數(shù)據(jù)庫(kù)的跨中心網(wǎng)絡(luò)流量飆到特別高掀抹。通過(guò)日志發(fā)現(xiàn),存在大量的字典數(shù)據(jù)請(qǐng)求(每個(gè)用戶(hù)1M的字典數(shù)據(jù)心俗,各種字典……)傲武。
由于字典數(shù)據(jù)的微服務(wù)沒(méi)做緩存,直接把請(qǐng)求淦到數(shù)據(jù)庫(kù)了另凌,而微服務(wù)對(duì)公共數(shù)據(jù)庫(kù)主庫(kù)的訪(fǎng)問(wèn)是跨中心的谱轨,所以大量的重復(fù)的字典數(shù)據(jù)占用了寶貴的帶寬(跨中心的帶寬很有限,這個(gè)是基礎(chǔ)設(shè)施規(guī)劃的問(wèn)題吠谢,一時(shí)半會(huì)解決不了的)土童。
箭已經(jīng)射出去了,不可能現(xiàn)場(chǎng)改代碼工坊。所以在Nginx上臨時(shí)做了proxy_cache來(lái)把脖子上的刀挪開(kāi)献汗。
操作
查看日志發(fā)現(xiàn),獲取字典數(shù)據(jù)的URL是POST請(qǐng)求王污,故需要做對(duì)POST請(qǐng)求進(jìn)行緩存罢吃。
- 配置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跨中心帶寬占用昭齐。
后話(huà)
最終尿招,還需要把緩存的刷新放回到微服務(wù)應(yīng)用層,最壞的情況阱驾,有大量的用戶(hù)會(huì)看到60s的舊數(shù)據(jù)就谜。