【问题标题】:Why does my AWS Lambda function keep timing out?为什么我的 AWS Lambda 函数总是超时?
【发布时间】:2019-09-17 13:43:52
【问题描述】:

我有一个在 node.js 8.10 上运行的 AWS Lambda 函数。此函数使用ioredis 库连接到Redis 服务器,获取键的值,然后返回该值。我可以在日志中看到连接成功,并且成功检索了该值。但是,响应永远不会返回,如果我查看日志,我可以看到 lambda 总是超时。

为什么这种情况不断发生?是否有某种原因导致 lambda 继续运行而不是从 Redis 返回值?

这是我的 lambda 函数中的代码:

const Redis = require('ioredis');
const redis = new Redis(6379, 'http://redis.example.com');

exports.handler = async (event, context) => {
  const value = await redis.get('mykey');
  console.log('value', value);  // this shows up in Cloudwatch logs
  return value;
};

【问题讨论】:

  • 您的回复是否需要以某种方式格式化? return { statusCode: 200, headers: { "Content-Type": "application/json" }, body: value };
  • 好吧,如果我删除所有 Redis 内容并返回一个类似 'foo' 的字符串,它就可以工作

标签: javascript amazon-web-services redis aws-lambda


【解决方案1】:

简短的回答:只需设置event.callbackWaitsForEmptyEventLoop = false

exports.handler = async (event, context) => {
  context.callbackWaitsForEmptyEventLoop = false;
  ...
};

为什么这很重要?

AWS Lambda 中 NodeJS 运行时的默认行为是等待 javascript 事件循环为空,然后结束 lambda 的执行并返回一个值。你可以阅读更多关于AWS Lambda and the node.js event loop works here的信息。

因此,您的 lambda 函数目前正在发生的事情是与 Redis 的连接使事件循环保持打开状态,从而阻止您的函数成功结束执行。

【讨论】:

    【解决方案2】:

    或者你可以关闭 Redis 连接。

    【讨论】:

    • 谢谢,这对我有用!调用set后,我在回调函数中关闭了redis连接。奇怪的是我在另一个 lambda 中有几乎相同的实现,而且如果不关闭它就不会超时
    猜你喜欢
    • 2017-05-28
    • 1970-01-01
    • 2017-07-20
    • 2017-07-22
    • 1970-01-01
    • 2017-09-28
    • 2019-06-17
    • 2020-12-06
    相关资源
    最近更新 更多