firebase - 部署时使 Google Cloud Function 的 Firebase 缓存失效
问题描述
我最近使用 Cloud Functions 和 Firebase 托管实现了 SSR。
构建 JS 包时,它会收到一个缓存突发后缀 ( main.1.js
)。
在我的函数中,我有以下代码用于缓存 Cloud Function 的结果
res.set('Cache-Control', 'public, max-age=300, s-maxage=300');
在部署过程中,我先部署托管,然后部署云功能
firebase deploy --only hosting:production && gcloud functions deploy ssr --runtime nodejs8 --trigger-http --source dist/server
firebase 托管部署替换main.1.js
为main.2.js
.
由于缓存破裂,文件现在不同(main.2.js
),但是因为云功能被缓存了另外 5 分钟 - 我在访问网站时遇到错误(因为main.1.js
在缓存版本中引用的功能不再可用) .
你会如何解决这样的问题?我可以有两个活动部署并一个接一个地激活吗?
解决方案
缓存控制标头public, max-age=300, s-maxage=300
告诉处理请求的任何一方(主要是用户的浏览器和 Google 的 CDN 服务器,但也可以是例如用户正在使用的代理)如何缓存请求。使用您的配置,两者都会将文件缓存 5 分钟。您无法更改此行为,因为无法使 CDN 服务器的缓存无效,并且浏览器也不知道您的部署,即使它会收到通知并重新加载,它也会从 CDN 获得相同的过时文件。
我不完全了解您的用例,但这里有可能的解决方案:
- 确保不要删除旧文件,因此您需要
main.x.js
至少在缓存期间保留任何版本。您可以使用 Cloud Storage 在部署时上传文件。 - 向客户端添加回退。如果
main.1.js
给出 404,请增加数字并尝试main.2.js
- 保持名称稳定,例如
main.js
- 将 的内容添加
main.js
到云函数的响应正文中。通过这样做,您可以确保云函数响应和内容main.x.js
一起缓存并一起重新加载 - 删除缓存控制标头。这将导致更高的功能流量,从而导致更高的成本。
- 还要更改您的函数名称或其在部署时的重写以导致缓存未命中
推荐阅读
- html - 是否可以使单选按钮看起来像复选框,没有图像?
- python - 将 pandas DataFrame 加载到带有小数列的 pyarrow 表中
- django - Django Admin:将初始数据提供给表单字段
- bash - 在脚本 bash 中更改目录
- r - 使用 mutate 和 purrr 的地图
- c# - 从 csv 文件中读取特定行并通过删除分隔符提取信息
- ffmpeg - Ffmpeg [NULL @ 0x56390335ae80] 无法找到适合“听”听的输出格式:无效参数
- image - Flutter Image Picker 仅在模拟器中工作
- c++ - 如何让代码检测 C++ 17 中是否存在文件?
- java - Java 和 Android Studio 监听器语法