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

时间:2017-08-25 14:10:45

标签: amazon-web-services amazon-cloudfront aws-api-gateway

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

对于我们的一个API端点,我们实现了补充节流机制,我们发送了429 HTTP响应。

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

1 个答案:

答案 0 :(得分:4)

根据对Can AWS API Gateway cache invalidate specific entries based on the response content?的响应,API网关缓存似乎没有“有时”缓存结果的功能。 documentation显示了让客户端发出忽略现有缓存的请求的方法(通过设置Cache-Control: max-age=0),但没有显示 server 表示“这是一个不应缓存的一次性响应。

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

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

  1. 关闭AWS API网关缓存。如果您需要缓存,请使用CloudFront或其他服务设置您自己的缓存,以便对缓存的响应进行更细粒度的控制。
  2. 尝试在此过程的早期移动限制(我不确定您是否使用内置的API Throttling features),但是因为您已经说过“实施”了您的机制我正在猜测你自己在后端处理请求。如果您可以在缓存层之前进行限制(无论是内置的API网关缓存还是其他系统),最终可能会解决您的问题并减轻后端请求处理程序的压力。
  3. 在向客户端发送429个响应后,当服务可以自由处理其他请求时,使用Cache-Control: max-age=0发送您自己的“缓存失效”请求以获取缓存的“实际”值。显然,这会有点棘手,因为你需要知道服务何时启动并可以处理更多请求而不会再次陷入困境,只要再次“免费”再添加一堆请求。
  4. 根据您的确切缓存需求,只需在缓存设置中使用足够低的TTL。例如,如果一旦限制开始,它可能在至少60秒内不再可用,那么具有60秒TTL意味着429响应将从该缓存中获得服务。但是,既然你只是在节流,因此你的服务“过载”,你的情况可能会继续服务429直到TTL到期。但是,对于“成功”和“失败”响应,这将需要是相同的短TTL。
相关问题