我们有一个启用了服务器端渲染的单页应用程序。我们托管在 AWS ELB 上。
应用程序资产(js
,css
文件)在文件名中有一个哈希值,用于控制客户端/代理端的缓存,并确保自新版本发布以来,我们的每个客户都将获得它的新版本。
为了获得良好的性能,我们决定缓存整个文档,包括页眉、正文和页脚。它有点像预渲染(包含所有组件)的结果,存储在缓存中。它运行良好,但有一个问题。
无论我们使用哪种部署策略,我们都会遇到这种情况。我们有两个实例,由于我们使用滚动方法(AWS 推荐的方法)将新构建部署到其中一个实例,因此我们使 无效Memcache
,但问题是:尚未更新的实例(以前的构建)正在运行(处理请求)。这意味着如果旧实例比新实例更快地接收请求(有时会发生这种情况),那么我们将在缓存中获得文档的旧版本,该文档引用不存在的资产(文件名中包含旧哈希值)。
我看到几个解决方案:1.开始对资产使用简单的文件名(避免哈希)2.memcache
在所有实例更新之前不要使用它们都不符合我们的要求。
还有其他解决方案吗?
答案1
您可以使用具有粘性负载平衡的蓝绿部署,但我不知道它是否足够可靠。理论上,您的部分流量将流向新服务器,包括对静态资源的请求。
另一种选择是将静态资产部署到所有服务器上,然后滚动部署代码。我不会在这里使用缓存清除技术,而是使用文件名来指示资产版本。这意味着您可以长时间缓存静态资产,但在部署时仍可轻松迁移到新版本。
另一种选择是从一台机器提供所有流量,更新另一台机器,然后进行切换/切换。
这实际上取决于您的应用程序、负载和偏好。也许上述某个想法对您有用,或者至少为您提供一些可供考虑的选项。