我有一个在 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,因为连接是加密的。
缓存在做什么,如何禁用它,以及如何清除它?