部署时使 Google Cloud Functions 的 Firebase 缓存无效
Invalidate Firebase cache for Google Cloud Function on deploy
我最近使用 Cloud Functions 和 Firebase 托管实现了 SSR。
构建 JS 包时,它会收到缓存突发后缀 (main.1.js
)。
在我的函数中,我有以下代码用于缓存云函数的结果
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
在函数的缓存版本中引用,不再可用)。
你会如何解决这样的问题?我可以有两个活动部署并一个接一个激活吗?
缓存控制 header public, max-age=300, s-maxage=300
告诉处理请求的任何一方(主要是用户的浏览器和 Google 的 CDN 服务器,但也可以是例如用户正在使用的代理) 如何缓存请求。根据您的配置,两者都会将文件缓存 5 分钟。您无法更改此行为,因为无法使 CDN 服务器的缓存无效,并且浏览器也不知道您的部署,即使它会收到通知并重新加载,它也会从 CDN 获取相同的过时文件。
我不完全理解你的用例,但这里有可能的解决方案:
- 确保不要删除旧文件,因此您需要至少在缓存持续时间内保留
main.x.js
的任何版本。您可以使用云存储在部署时上传文件。
- 向客户端添加回退。如果
main.1.js
给出 404,增加数字并尝试 main.2.js
- 保持名称稳定,例如
main.js
- 将
main.js
的内容添加到云函数的响应 body。通过这样做,您可以确保云函数响应和 main.x.js
的内容一起缓存并一起重新加载
- 删除缓存控件header。这将导致您的功能流量增加,从而导致成本增加。
- 同时更改您的函数名称或在部署时对其进行重写以导致缓存未命中
我最近使用 Cloud Functions 和 Firebase 托管实现了 SSR。
构建 JS 包时,它会收到缓存突发后缀 (main.1.js
)。
在我的函数中,我有以下代码用于缓存云函数的结果
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
在函数的缓存版本中引用,不再可用)。
你会如何解决这样的问题?我可以有两个活动部署并一个接一个激活吗?
缓存控制 header public, max-age=300, s-maxage=300
告诉处理请求的任何一方(主要是用户的浏览器和 Google 的 CDN 服务器,但也可以是例如用户正在使用的代理) 如何缓存请求。根据您的配置,两者都会将文件缓存 5 分钟。您无法更改此行为,因为无法使 CDN 服务器的缓存无效,并且浏览器也不知道您的部署,即使它会收到通知并重新加载,它也会从 CDN 获取相同的过时文件。
我不完全理解你的用例,但这里有可能的解决方案:
- 确保不要删除旧文件,因此您需要至少在缓存持续时间内保留
main.x.js
的任何版本。您可以使用云存储在部署时上传文件。 - 向客户端添加回退。如果
main.1.js
给出 404,增加数字并尝试main.2.js
- 保持名称稳定,例如
main.js
- 将
main.js
的内容添加到云函数的响应 body。通过这样做,您可以确保云函数响应和main.x.js
的内容一起缓存并一起重新加载 - 删除缓存控件header。这将导致您的功能流量增加,从而导致成本增加。
- 同时更改您的函数名称或在部署时对其进行重写以导致缓存未命中