一、背景
网站在高峰期时段会出现访问失败等情况,数据库负载过大,后端程序处理完成时间远大于60s。而数据库实例目前无扩容规划。针对该情况只能考虑使用缓存来降低数据库负载。
二、架构设计
计划使用nginx进行内容缓存,但面临两个问题1;如何区别不同用户,通过token或者cookie区分还是其他方式?2;TTL缓存时间,含失效。最终设计仅对普通游客进行页面缓存(带有cookie的请求报文直接转发至后端),同时缓存时间仅设置1分钟。
三、Nginx配置
if ($http_cookie ~* "AK"){
set $cachehost "off";
}
if ($http_cookie !~* "AK"){
set $cachehost "cache_one";
}
proxy_cache $cachehost;
proxy_set_header nginxLanguage '0';
add_header locallanguage '0';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header HTTP_X_FORWARDED_FOR $remote_addr;
proxy_pass http://web;
}
#备注:nginx部分配置
四、问题
- 缓存实际上是用来提升网站性能而非用来解决故障的,只是该站点项目因容量规划不足而使用缓存来解决实际问题。会员用户没有缓存功能。-
-
扩展性差,可能还有某些问题只是目前我没有发现而已
五、可替代方案探讨
缓存策略上线后也发现了一系列问题,例如这种缓存实际没有什么扩展性且无法应对各种复杂的需求,仅缓存1分钟时间也足以说明此方案的局限性。由此引发了自己对于动态内容分发的研究。大致思路为在微服务Gateway网关层做一层动态内容缓存。这里要解决的点有1;缓存我想缓存的内容2;内容失效的设置3;能否通过token或者cookie区别同一个url的缓存
留言