【问题标题】:AWS API Gateway GET response always cachedAWS API Gateway GET 响应始终缓存
【发布时间】:2017-12-03 17:46:33
【问题描述】:

更新:我想通了,请看下面的答案。

我有一个使用各种资源和各种 GET 和 POST 方法定义的 AWS API Gateway api。

一切正常。 帖子正在通过。 GET 会返回响应(JSON 负载),但返回的值似乎是 缓存 值。

我的 GET api 调用一个调用 RDS 查询的 Lambda 函数。 我可以确认我的回复已过时,因为:

  • 当我手动查询 RDS 时,我得到了更新后的值
  • 我启用了 Cloud Watch 日志,但没有调用 lambda 函数(我相信我设置正确,因为当我测试调用 lambda 时,我可以获得 Cloud Watch 日志)

它确实刷新了一次,但我认为那是因为我超过了一些(比如 1 小时)缓存阈值之类的。

我了解 API Gateway 在后台生成 CloudFront。 我觉得这就是做缓存的原因。但这只是猜测,我没有证据。也许某种默认缓存 TTL?

我显然在我的 API Gateway 阶段关闭了缓存。 我什至尝试启用它,将 TTL 设置为 1,刷新缓存,然后再次禁用缓存。 该测试的每个阶段仍然返回过时的值。

我不知道这是否相关,但补充细节:

  • 我启用了 CORS ("*")
  • 我启用了 Cognito 授权器
  • 我通过 Authorization 标头传入 JWT 令牌(一切正常)

我应该传递一些标头来请求未缓存的值吗? 我去了 CloudFront,但那里没有配置。

关于 API Gateway 缓存的所有其他帖子似乎都是关于缓存不起作用或人们询问缓存键的特异性。 无论如何,我都没有看到任何关于值总是被缓存的信息。所以我觉得我错过了一些明显的东西......

任何帮助或调试提示将不胜感激!

【问题讨论】:

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


    【解决方案1】:

    好的,所以我觉得自己回答自己的问题是个白痴,但希望有一天它对某人有所帮助。

    这不是 API 网关缓存问题。 问题是 pymysql 连接和 lambda 会话缓存问题。

    我的 Lambda 使用 pymysql 来查询 MySQL RDS。 根据推荐的性能原因,我在 lambdas 之间重用了连接(这意味着我没有每次都关闭连接)。

    解决方案是调用 conn.commit()

    在我完成 fetchall() 之后

    发生的事情是我随后的调用返回了一个缓存的查询结果(称为一致读取。谢谢!@Michael - sqlbot)我相信我可能有多个 lambda 容器或类似的东西当我有一段时间不活动(即忙于阅读 stackoverflow 帖子)时,lambda 会卸载。然后我的下一次 API 网关尝试将重新初始化一个新的 lambda 处理程序,并创建一个新的分支连接(没有缓存)。所以这就是为什么它似乎“有时工作,然后停止”。

    抱歉,如果我浪费了任何人的时间。

    【讨论】:

    • “正在返回一个缓存的查询结果。” 更准确地说,听起来他们正在返回一个一致的读取。
    • 我面临着完全相同的问题。我正在用无服务器打包一个 Flask 应用程序。 Flask/SQLAlchemy 应该处理任何会话失效和清理,所以我对我的问题感到损失,但我相信它也是 Lambda (Flask) -> RDS 是调用链中的问题
    【解决方案2】:

    感谢您提出并回答您自己的问题。我遇到了同样的问题,正在努力寻找正在缓存结果的 API 网关设置。

    【讨论】:

      猜你喜欢
      • 2018-02-03
      • 2019-03-22
      • 1970-01-01
      • 2018-06-09
      • 1970-01-01
      • 2019-04-29
      • 2016-04-16
      • 2019-10-25
      • 1970-01-01
      相关资源
      最近更新 更多