Google app engine 部署之间的Google前端保留
部署期间静态资产的保留策略行为是否有任何定义 换句话说,如果我运行v1并部署v2,是否可以确保v1的资产可用于整个app deploy命令?我对定义多个服务特别感兴趣 我看过这些文章,但它们并没有对行为提供太多的见解 更具体地说,我有一个项目与3个服务Google app engine 部署之间的Google前端保留,google-app-engine,Google App Engine,部署期间静态资产的保留策略行为是否有任何定义 换句话说,如果我运行v1并部署v2,是否可以确保v1的资产可用于整个app deploy命令?我对定义多个服务特别感兴趣 我看过这些文章,但它们并没有对行为提供太多的见解 更具体地说,我有一个项目与3个服务 服务:资产,提供静态图像、css、js等,充当无cookie域 site.yaml-服务:默认,为“宣传册站点”提供静态html app.yaml-服务应用程序、go应用程序提供/healthz、/readyz和/a/* dispatch
- 服务:资产,提供静态图像、css、js等,充当无cookie域
- site.yaml-服务:默认,为“宣传册站点”提供静态html
- app.yaml-服务应用程序、go应用程序提供/healthz、/readyz和/a/*
- dispatch.yaml-用于路线规范
首先,在应用程序级别没有部署,每个服务都是独立部署的。您只需通过在相同的CLI调用中同时(几乎)部署所有服务来模拟应用程序级部署,但从技术上讲,它们仍然是独立部署的 静态文件的可用性由发布它们的服务版本的生命周期决定。因此,只要部署了
asset
服务的v1
和v2
版本,css/bootstrap-4b2.min.css
和css/bootstrap-4b3.min.css
都可能可用。但有一个转折点:这取决于服务的哪个版本接收请求——只有服务于特定版本文件的服务版本才应该/将服务于该文件版本。否则,服务的行为将不是确定性的——如果本地服务器上的404版本不提供文件服务,那么您总是会得到404,但在GAE上,您会得到404或文件,这取决于提供该文件服务的版本是否仍在部署,这将是一个bug
决定哪个版本的服务接收请求取决于URL路由规则(请参阅-这是dispatch.yaml
内容发挥作用的地方)和该服务的流量分布配置(请参阅和)
例如,假设asset
versionv1
配置为接收服务的所有流量。在这种情况下:
- 请求
应该可以工作,https://your_app.appspot.com/css/bootstrap-4b2.min.css
通过v1
规则获取请求dispatch.yaml
- 请求
应返回404,https://your_app.appspot.com/css/bootstrap-4b3.min.css
通过v1
规则获取请求dispatch.yaml
- 请求
应该可以工作,https://v1-dot-assets-dot-your_app.appspot.com/css/bootstrap-4b2.min.css
通过软路由获取请求v1
- 请求
应返回404,https://v1-dot-assets-dot-your_app.appspot.com/css/bootstrap-4b3.min.css
通过软路由获取请求v1
- 请求
应返回404,https://v2-dot-assets-dot-your_app.appspot.com/css/bootstrap-4b2.min.css
通过软路由获取请求v2
- 请求
应该可以工作,https://v2-dot-assets-dot-your_app.appspot.com/css/bootstrap-4b3.min.css
通过软路由获取请求v2
最后,以上所有内容都没有考虑缓存问题(在不同级别)。但是,只有在您修改文件内容的同时保留相同的文件名(即URL)时,这些才会影响您,这在本问题中并非如此。我们是否应该假设在从中提取的边缘位置没有缓存任何资产?您的
dispatch.yaml
文件的内容是什么?答案取决于它。@BrandOnTomson我不确定依赖缓存控制头是否理想,因为这是一个倒计时。如果我有一个300s的缓存控制,但我在299s部署它可能会导致有人在299s发出请求,接收v1的HTML和404的CSS。我将添加一个示例@DanCornilescu您能否澄清这将如何影响从前端添加/删除文件的行为?我认为它完全负责将静态_文件/上传的实际文件上传到Google Frontend或AppEngine的路由。我想我的答案是把资产和谷歌云存储放在一起,或者在资产URL的主机部分引用“版本”(但我希望包含所有内容),谢谢,这基本上回答了我的问题。我不希望缓存成为一个问题,因为请求的“根”是驱动资产请求的因素,并且资产将具有全局唯一的名称。我对陈旧的读取(例如v1 w/bootstrap-4b2.css)没有意见,但我想避免的是404,因为v1所需的资产不再存在。最安全的方法似乎是在部署中保留所有版本的资产。“首先,应用程序级别没有部署,每个服务都是独立部署的。您只需通过部署所有服务(几乎)来模拟应用程序级别的部署同时,在同一个CLI调用中,但从技术上讲,它们仍然是独立部署的。”我认为是这样,但不确定是否有
# dispatch.yaml
# prod assets
- url: "a.example.net/*"
service: assets
# local development assets
- url: "*/css/*"
service: assets
# local development assets
- url: "*/js/*"
service: assets
# local development assets
- url: "*/media/*"
service: assets
- url: "*/a/*"
service: app
- url: "*/healthz"
service: app
- url: "*/readyz"
service: app
gcloud app deploy --project=$PROJECT dispatch.yaml assets.yaml default.yaml app.yaml --quiet --version $VERSION