繁体   English   中英

AWS Lambda 是否缓存 API 响应?

[英]Does AWS Lambda cache API responses?

我的 Lambda function 调用 CloudWatch describe-alarms API。然后删除这些警报。 我使用 CloudWatch Cron Event 作为触发器。

我的印象是带有警报的响应被缓存,即使它们被删除仍然会出现。

AWS Lambda 中是否有任何缓存系统?

缓存响应的是您的代码。 不是 Lambda。

要修复它,您必须通过确保处理程序中调用 API 并返回它而不将其存储在处理程序函数的范围之外来修复代码。

出于说明目的,

const response = callAnApi()

async function handler(event, context, callback) {
  // No matter how many times you call the handler,
  // response will be the same
  return callback(null, response)
}

async function handler(event, context, callback) {
  // API is called each time you call the handler.
  const response = await callAnApi()

  return callback(null, response)
}

参考: AWS Lambda 执行模型

您的 Lambda 函数代码中的任何声明(在处理程序代码之外,请参阅编程模型)保持初始化状态,从而在再次调用该函数时提供额外的优化。 例如,如果您的 Lambda 函数建立了数据库连接,而不是重新建立连接,而是在后续调用中使用原始连接。 我们建议在您的代码中添加逻辑以在创建连接之前检查连接是否存在。

据我所知,AWS Lambda 中没有缓存机制,

也就是说,在(成功)请求之后,Lambda 创建的容器被“冻结”以防止它执行“异步”或“后台”工作。 后续请求将重用容器并将新事件传递给您的函数处理程序。 这个容器将保留在集群中,准备好被重用并为请求提供服务,以至于它不会闲置太久,之后它可能会被完全丢弃。 AWS 未指定这些详细信息。

因为容器会一直等待后续请求,而且分配给它的内存不会每次都神奇地消失,所以我们可以为以后的请求存储数据。 (但不推荐)

补充:如果您通过 API 网关访问 AWS Lambda,那么您可以在 API 网关级别激活缓存,这对于使用 Lambda 提高速度和降低成本非常有用。 该缓存系统允许您使用参数、请求标头等作为调用的键,使其简单高效。

感谢 Noels 的回答,我遇到了类似的问题,其中 API GW 使用 lambda(python 运行时)函数(禁用了 api gw 缓存)。问题是我在 lambda 处理程序之外定义了数据库连接。 下面代码的结果是来自 api 的旧数据(即使在数据库表更新之后)。

db = pymysql.connect(host=DB_HOST,user=DB_USER, password=DB_PSWD,database=DB_NAME,cursorclass=pymysql.cursors.DictCursor)
cursor = db.cursor()

def lambda_handler(event, context):
                try:
                    cursor.execute("SELECT id, product FROM repository")
                    return { "body":json.dumps(cursor.fetchall()), "statusCode":200}
                    
                except Exception as e:
                    return { "body":json.dumps(event), "statusCode":500}

为了解决这个问题,我将数据库连接移到了 lambda 处理程序中:

def lambda_handler(event, context):
        db = pymysql.connect(host=DB_HOST,user=DB_USER, password=DB_PSWD,database=DB_NAME,cursorclass=pymysql.cursors.DictCursor)
        cursor = db.cursor()
                try:
                    cursor.execute("SELECT id, product FROM repository")
                    return { "body":json.dumps(cursor.fetchall()), "statusCode":200}
                    
                except Exception as e:
                    return { "body":json.dumps(event), "statusCode":500}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM