防止在 AWS API 网关中缓存非 200 响应

Prevent caching of non 200 responses in AWS API Gateway

我应该如何在 API 网关中禁用非 200 OK 响应的缓存。

对于我们的 API 端点之一,我们实施了补充节流机制,并且我们正在发送 429 HTTP 响应。

目的是让客户端在服务器准备好完成请求后的短时间后重试请求,但现在发生的是 API 网关缓存初始响应并继续从缓存中发送相反。

根据对 Can AWS API Gateway cache invalidate specific entries based on the response content?, the API Gateway cache doesn't appear to have the functionality to just "sometimes" cache a result. The documentation 的响应显示了一种让 客户端 发出忽略现有缓存的请求的方法(通过设置 Cache-Control: max-age=0) ,但没有显示 服务器 说“这是一个 single-use 不应缓存的响应。

我认为值得尝试的第一件事是在您的错误响应中指定一个 header 比如 Cache-Control: max-age=0 只是为了尝试看看它是否有效。 AWS API 网关在后台使用 CloudFront 进行分发,因此它可能正常工作。

如果这不起作用,其他选项包括:

  1. 关闭 AWS API 网关缓存。如果您需要缓存,请使用 CloudFront 或其他允许更多fine-grained 控制缓存哪些响应的服务来设置您自己的缓存。
  2. 尝试在此过程中更早地移动节流(我不确定您是否使用 built-in API Throttling features),但既然您已经说过 "implemented"您的机制 我猜您是在 back-end 处理请求时自己做的。如果您可以在缓存层之前进行节流(无论是 built-in API 网关缓存还是其他系统),这可能最终会解决您的问题并减轻您的 back-end 请求的压力处理程序。
  3. 向客户端发送 429 响应后,当服务可以处理更多请求时,发送您自己的 "cache invalidation" 请求和 Cache-Control: max-age=0 以获取缓存的 "real" 值。显然,这会有点棘手,因为您需要知道服务何时启动并可用于处理更多请求,而不会在它再次 "free" 时立即添加更多请求而再次陷入困境。
  4. 根据您的确切缓存需求,只需在缓存设置中设置 low-enough TTL。例如,如果一旦启动限制,它可能在至少 60 秒内不再可用,那么拥有 60 秒的 TTL 意味着 429 响应将从缓存中获取。但是,由于您只是在节流,因此您的服务是 "overloaded",您的情况可能可以接受继续提供 429 直到 TTL 到期。不过,"success" 和 "failure" 响应都需要相同的短 TTL。