比较来自世界各地的卖家的域名和 IT 服务价格

如何连接到实例 Redis 来自功能 AWS Lambda?

我正在努力创造 API 对于单页Web应用程序使用
https://aws.amazon.com/lambda/

https://github.com/serverless/serverless
. 我想使用
https://redislabs.com/redis-cloud
用于存储,主要用于其速度和数据的组合。 在未来,我可以使用更多功能 Redis Cloud, 所以我不想用它 ElastiCache. 我的实例 Redis Cloud 在同一地区工作 AWS, 什么是我的功能。

我有一个功能
related

, 从请求中占用Hashteg GET 在终点 API 并检查数据库中是否存在条目。 如果他是,他必须立即返回结果。 如果不 , 他必须要求
https://ritetag.com/
, 记录结果B. 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

/, 它起作用B.

他第一次开始后 deployment

, 然后停止工作。 所有后续尝试运行它只是返回
null

在浏览器中 /或者 Postman, 或者 curl, 或Web应用程序/. 无论标签是否所在,都是如此,我在数据库中使用它用于测试。 如果我然后重新启动,在不对函数本身进行任何更改,它将获得一次。

在我的本地机器上,功能首页寄存器
Connected: true

在控制台中,然后查询结果,然后
Connection closed.

在 AWS, 它注册
Connected: true

, 然后查询结果,就是这样。 通过第二个发布,IT注册
Connection closed.

而不是别的。 在第三个和所有后续启动,他根本没有注册任何东西。 没有环境报告任何错误。

它似乎很明显这个问题已连接到 Redis. 如果我在反馈中没有关闭它,那么随后的导致该功能的尝试将简单地离开。 我也试图使用
redis.unref

反而
redis.quit

, 但似乎没有意义。

任何帮助都会非常感激。
已邀请:

诸葛浮云

赞同来自:

现在我解决了自己的问题,我希望我能帮助未来面临这个问题的人。

连接到数据库时有两个基本注意事项,因为我在函数中的上面代码中所做的。 Lambda:

挑战后
context.succeed//

,
context.fail//

或者
context.done//

AWS 可能会冻结任何流程 , 哪个尚未完成。 这就是所做的 AWS 登记
Connection closed

通过第二个呼叫我的终点,API过程就在之前冻结了 Redis 他毕业于关闭,然后在下次召开时拒绝,之后他继续在他停止的地方继续,报告联系已关闭。 如果要关闭与数据库的连接,请确保完全关闭,



如何调用其中一种方法。 你能行的 , 通过将回调放置到在连接关闭时运行的事件处理程序 / 在我的情况下
.on/'end'/

/.

如果将代码划分为单独的文件和
require

他们在每个文件的顶部,就像我一样, Amazon 它将在内存中尽可能多的这些模块缓存。 如果导致问题,请尝试移动呼叫
require//

在函数内,而不是在文件的顶部,然后导出此功能。 然后每次启动功能时都会重新导入这些模块。

这是我的更新代码。 请注意,我也放置了我的配置 Redis 在单独的文件中,以便我可以将其导入其他函数 Lambda 没有重复的代码。

事件处理程序


'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/
}
}/
}


Redis 配置


module.exports = // => {
const redis = require/'redis'/
const jsonify = require/'redis-jsonify'/
const redisOptions = {
host: process.env.REDIS_URL,
port: process.env.REDIS_PORT,
password: process.env.REDIS_PASS
}

return jsonify/redis.createClient/redisOptions//
}


功能


'use strict'

const rt = require/'./ritetag'/

module.exports.respond = function /event, callback/ {
const redis = require/'./redis'///

const tag = event.hashtag.replace//^#/, ''/
const key = 'related:' + tag
let error, response

redis.on/'end', // => {
callback/error, response/
}/

redis.on/'ready', function // {
redis.get/key, /err, res/ => {
if /err/ {
redis.quit/// => {
error = err
}/
} else {
if /res/ {
// Tag is found in Redis, so send results directly.
redis.quit/// => {
response = res
}/
} else {
// Tag is not yet in Redis, so query Ritetag.
rt.hashtagDirectory/tag, /err, res/ => {
if /err/ {
redis.quit/// => {
error = err
}/
} else {
redis.set/key, res, /err/ => {
if /err/ {
redis.quit/// => {
error = err
}/
} else {
redis.quit/// => {
response = res
}/
}
}/
}
}/
}
}
}/
}/
}


它完全相同,除此之外。

要回复问题请先登录注册