我正在尝试使用AWS Lambda和Serverless Framework为单页Web应用程序构建API。我想使用Redis Cloud进行存储,主要是因为其速度和数据持久性的组合。将来可能会使用更多的Redis Cloud功能,因此我希望避免使用ElastiCache。我的Redis Cloud实例正在与我的函数相同的AWS区域中运行。
我有一个名为
我对此还比较陌生,所以我可能在做一些可爱而幼稚的事情。以下是事件处理程序:
所有这些都按预期工作,但只到一定程度。如果我在本地运行函数(使用
在我的本地机器上,该函数首先将
似乎问题明显出在与 Redis 的连接上。如果我在回调函数中不关闭它,那么后续尝试调用该函数只会超时。我还尝试使用
我有一个名为
related
的函数,它从API端点的GET请求中获取一个标签,并检查数据库中是否有该条目。如果存在,则应立即返回结果。如果不存在,则应查询RiteTag,将结果写入Redis,然后将结果返回给用户。我对此还比较陌生,所以我可能在做一些可爱而幼稚的事情。以下是事件处理程序:
'use strict'
const lib = require('../lib/related')
module.exports.handler = function (event, context) {
lib.respond(event, (err, res) => {
if (err) {
return context.fail(err)
} else {
return context.succeed(res)
}
})
}
这是 ../lib/related.js
文件:
var redis = require('redis')
var jsonify = require('redis-jsonify')
var rt = require('./ritetag')
var redisOptions = {
host: process.env.REDIS_URL,
port: process.env.REDIS_PORT,
password: process.env.REDIS_PASS
}
var client = jsonify(redis.createClient(redisOptions))
module.exports.respond = function (event, callback) {
var tag = event.hashtag.replace(/^#/, '')
var key = 'related:' + tag
client.on('connect', () => {
console.log('Connected:', client.connected)
})
client.on('end', () => {
console.log('Connection closed.')
})
client.on('ready', function () {
client.get(key, (err, res) => {
if (err) {
client.quit()
callback(err)
} else {
if (res) {
// Tag is found in Redis, so send results directly.
client.quit()
callback(null, res)
} else {
// Tag is not yet in Redis, so query Ritetag.
rt.hashtagDirectory(tag, (err, res) => {
if (err) {
client.quit()
callback(err)
} else {
client.set(key, res, (err) => {
if (err) {
callback(err)
} else {
client.quit()
callback(null, res)
}
})
}
})
}
}
})
})
}
所有这些都按预期工作,但只到一定程度。如果我在本地运行函数(使用
sls function run related
),我完全没有任何问题 - 标签按照应有的方式从Redis数据库中读取和写入。然而,当我部署它(使用sls dash deploy
)时,它在部署后第一次运行时可以工作,然后就停止工作了。所有后续尝试运行它只是简单地向浏览器(或Postman、curl或Web应用程序)返回null
。不管我用于测试的标签是否已经存在于数据库中,这都是真实的。如果我重新部署,对函数本身不做任何更改,它再次工作-一次。在我的本地机器上,该函数首先将
Connected: true
记录到控制台,然后记录查询的结果,然后是Connection closed.
。在AWS上,它记录Connected: true
,然后是查询的结果,仅此而已。在第二次运行时,它记录Connection closed.
,没有别的东西。在第三次及所有后续运行中,它根本不记录任何内容。两个环境都从未报告任何错误。似乎问题明显出在与 Redis 的连接上。如果我在回调函数中不关闭它,那么后续尝试调用该函数只会超时。我还尝试使用
redis.unref
替代 redis.quit
,但似乎没有任何区别。
非常感谢您的帮助。