一、背景

网站在高峰期时段会出现访问失败等情况,数据库负载过大,后端程序处理完成时间远大于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的缓存

最后修改日期: 2024年1月6日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。