【问题标题】:AWS Lambda and Redis client. Why can't I call callback?AWS Lambda 和 Redis 客户端。为什么我不能调用回调?
【发布时间】:2017-01-28 14:50:14
【问题描述】:

我正在尝试编写一个使用 Redis 的 AWS Lambda 函数。当我运行下面的代码时:

'use strict'

function handler (data, context, callback) {
  const redis = require("redis")
  const _ = require("lodash")
  console.log('before client')
  const client = redis.createClient({
    url: 'redis://cache-url.euw1.cache.amazonaws.com:6379',
  })
  console.log('after client')
  callback(null, {status: 'result'})
  console.log('after callback')
}

exports.handler = handler

我有这样的答案:

{
  "errorMessage": "2016-09-20T15:22:27.301Z 07d24e0b-7f46-11e6-85e9-e5f48906c0da Task timed out after 3.00 seconds"
}

日志看起来像:


17:22:24
START RequestId: 07d24e0b-7f46-11e6-85e9-e5f48906c0da Version: $LATEST

17:22:26
2016-09-20T15:22:26.014Z    07d24e0b-7f46-11e6-85e9-e5f48906c0da    before client

17:22:26
2016-09-20T15:22:26.134Z    07d24e0b-7f46-11e6-85e9-e5f48906c0da    after client

17:22:26
2016-09-20T15:22:26.135Z    07d24e0b-7f46-11e6-85e9-e5f48906c0da    after callback

17:22:27
END RequestId: 07d24e0b-7f46-11e6-85e9-e5f48906c0da

17:22:27
REPORT RequestId: 07d24e0b-7f46-11e6-85e9-e5f48906c0da  Duration: 3001.81 ms    Billed Duration: 3000 ms Memory Size: 128 MB    Max Memory Used: 24 MB

17:22:27
2016-09-20T15:22:27.301Z 07d24e0b-7f46-11e6-85e9-e5f48906c0da Task timed out after 3.00 seconds

恕我直言,这意味着回调被调用但没有发生任何事情。

当我删除客户端的初始化时,我看到了正确的响应。

有什么想法吗?

【问题讨论】:

  • 我从不使用 Redis,但请注意 Lambda 是一种无状态服务。注意创建客户端和打开连接。几个月前,我尝试对 MongoDB 做同样的事情,但我在连接中发现了问题。不知道这里是不是一样。
  • 是的,我知道。但我在每个调用(内部处理程序)上创建一个连接。如果没有办法使用 db(dynamoDB 除外),它就会变得毫无用处
  • 这正是我遇到 MongoDB 问题时的想法。即使使用 RDS 也是一个问题。我相信,如果您不使用 AWS SDK 并进行一百次 api 调用,则不值得使用。如我所见,lambda 仅适用于无状态服务,而 BD 不是无状态的。希望有人告诉我们更多。
  • 是否可以在 lambda 中访问 c​​ache-url.euw1.cache.amazonaws.com:6379?检查您是否为您的 redis 实例提供了正确的入站配置。
  • 我认为,问题在于上下文。见这篇文章:aws.amazon.com/es/blogs/compute/…

标签: node.js amazon-web-services redis aws-lambda


【解决方案1】:

来自the official documentation:

调用回调时,Lambda 函数仅在 Node.js 事件循环为空。

由于您正在调用回调,但您的 Lambda 函数调用并未结束,看来您在事件循环中仍有一些内容。除了创建 Redis 连接之外,您的函数实际上并没有做任何事情。我猜你需要在完成后关闭 Redis 连接,以清除事件循环并允许 Lambda 调用完成。

【讨论】:

  • 是的,我已将代码简化为最小可行样本。我会尝试关闭连接并返回给你
猜你喜欢
  • 2020-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-12
  • 2019-09-28
  • 1970-01-01
  • 2019-02-05
  • 1970-01-01
相关资源
最近更新 更多