1

我有一个在 App Engine 上的自定义 Java 容器中运行的应用程序。我一直在试图找出为什么我收到过时的响应,并将问题缩小到缓存的响应。

我知道我们的应用程序没有返回过时的内容,因为我们没有共享缓存,并且在我们重新部署后过时的响应仍然存在。我们也没有使用 Cloud CDN。

当我在https://[app-id].appspot.com/api/123访问我的应用程序 API 时,我的应用程序返回一个Cache-Control: public, s-maxage=31536000, max-age=3600响应标头。s-maxage旨在告诉 Cloudflare(我们的 CDN)缓存响应,我们在更新内容时手动清除 Cloudflare 的缓存。但是,我们的应用程序前面似乎有一些东西正在缓存响应。在缓存的响应中,日期响应标头保持不变并且年龄增加,表明内容确实是陈旧的。

我在 App Engine 标准文档中看到了有关缓存的文档app.yaml,但我在 App Engine 灵活文档中找不到任何提及缓存基础设施的内容。我的心智模型是,只有 HTTPS 负载平衡代表应用程序发生,但情况似乎并非如此。

如果我尝试通过 SSH 连接到 Compute Engine 实例或 App Engine Flexible 实例从 GCP 中重现此问题,我不会观察到任何缓存。但是,我已经从其他云和笔记本电脑上尝试过,并且缓存是一致的。Cloudflare 支持人员最初提醒我们注意这种行为,他们看到了来自生产数据中心的缓存,这些数据中心通过他们的 CDN 互连程序直接与 Google 对等。

这必须来自 Google 的基础架构本身,可能是用于 App Engine 的隐藏的 Google Cloud Load Balancer,因为连接是加密的。

缓存在做什么,如何禁用它,以及如何清除它?

4

1 回答 1

0

App Engine 实例前面的服务基础架构可能会缓存请求,尽管这不是官方记录的功能。如果您有很多客户端从同一个网络访问 App Engine,则您更有可能看到这种情况,导致所有客户端都访问同一组缓存并保持这些缓存温暖。没有用于刷新缓存的 API,因此 John Hanley 在上面的评论中提供的建议是最好的缓解措施:对您只想由特定版本的应用程序提供服务的静态文件使用特定于版本的 URL。

于 2020-10-07T02:56:35.620 回答