Redis 和 Google 云函数
Redis and Google Cloud Functions
我正在使用 ioredis
到 set
值到 redis 企业实例。
- 如何在几秒钟后关闭连接以减少创建的客户端数量?
- 我是否需要关闭连接?
- 是否每次调用都会产生一个 Redis 客户端?
- 我需要 VPC 连接器吗?
- 如何确保函数在同一个
ip:port
上运行以防止创建其他实例
import * as functions from "firebase-functions";
import Redis = require("ioredis");
const redis = new Redis("redis://default:jMSNpTm3JXs1@redis-15360.c228.us-central1-1.gce.cloud.redislabs.com:15360");
export const SaveRecord = functions.https.onCall(async (data,context)=>{
const {record,recordID} = data;
try{
var result = await redis.multi().set(recordID, record).expire(recordID,3600).exec();
return result;
}catch(e){
console.log(e);
return "error";
}
})
我从未在我的项目中部署过 Redis Cloud Enterprise,但我已经可以提供这些答案
1,2,3。您不需要在每次连接时都关闭连接。在您的代码中,您开始(第 4 行)到您的 Redis 的连接并将其存储在全局变量中(在全局范围内,而不是在函数体中)。
这意味着,当 Cloud Functions 实例启动时,它会调用所有全局代码(您的前 4 行,然后调用您的函数。redis
变量保留在 Cloud Functions 调用之间。
但是,您需要检查 redis Cloud 默认连接超时,并能够在连接关闭的情况下执行重新连接(代码中的异常处理)。
关于连接是否关闭,也取决于Redis Cloud配置:空闲连接是否自动关闭?如果没有,那将是困难的。在闲置 1 小时 activity 或更短时间后,尝试通过 Redis 服务器配置关闭闲置连接。 (云功能实例通常在 activity 30 分钟后卸载,没有任何 Google 云承诺)。
是;如果你查看你的 URL 上注册的 IP(例如 nelookup redis-15360.c228.us-central1-1.gce.cloud.redislabs.com
),你会在 172.26.x.x 中找到一个 URL。这是一个 RFC 1918 私有 IP。 DNS 解析是外部的(向 redislab URL 服务器的 IP 询问),但目标服务器在您的项目内部。您只能路由内部流量。
Cloud Functions 服务根据 HTTP 流量创建和销毁实例。您无法阻止实例的创建或销毁,它是无服务器的。同样,您没有 IP/PORT 关联到您的 Cloud Functions 实例,它是无服务器的。如果您只想拥有 1 个 Cloud Functions 实例,则可以将最大实例设置为 1。但是,请注意,Cloud Functions 一次只能在同一实例上处理 1 个请求。最大实例为 1,如果你有 2 个并发请求,将处理 1 个,另一个将等待,10 秒后将返回 417 HTTP 错误。
我正在使用 ioredis
到 set
值到 redis 企业实例。
- 如何在几秒钟后关闭连接以减少创建的客户端数量?
- 我是否需要关闭连接?
- 是否每次调用都会产生一个 Redis 客户端?
- 我需要 VPC 连接器吗?
- 如何确保函数在同一个
ip:port
上运行以防止创建其他实例
import * as functions from "firebase-functions";
import Redis = require("ioredis");
const redis = new Redis("redis://default:jMSNpTm3JXs1@redis-15360.c228.us-central1-1.gce.cloud.redislabs.com:15360");
export const SaveRecord = functions.https.onCall(async (data,context)=>{
const {record,recordID} = data;
try{
var result = await redis.multi().set(recordID, record).expire(recordID,3600).exec();
return result;
}catch(e){
console.log(e);
return "error";
}
})
我从未在我的项目中部署过 Redis Cloud Enterprise,但我已经可以提供这些答案
1,2,3。您不需要在每次连接时都关闭连接。在您的代码中,您开始(第 4 行)到您的 Redis 的连接并将其存储在全局变量中(在全局范围内,而不是在函数体中)。
这意味着,当 Cloud Functions 实例启动时,它会调用所有全局代码(您的前 4 行,然后调用您的函数。redis
变量保留在 Cloud Functions 调用之间。
但是,您需要检查 redis Cloud 默认连接超时,并能够在连接关闭的情况下执行重新连接(代码中的异常处理)。
关于连接是否关闭,也取决于Redis Cloud配置:空闲连接是否自动关闭?如果没有,那将是困难的。在闲置 1 小时 activity 或更短时间后,尝试通过 Redis 服务器配置关闭闲置连接。 (云功能实例通常在 activity 30 分钟后卸载,没有任何 Google 云承诺)。
是;如果你查看你的 URL 上注册的 IP(例如
nelookup redis-15360.c228.us-central1-1.gce.cloud.redislabs.com
),你会在 172.26.x.x 中找到一个 URL。这是一个 RFC 1918 私有 IP。 DNS 解析是外部的(向 redislab URL 服务器的 IP 询问),但目标服务器在您的项目内部。您只能路由内部流量。Cloud Functions 服务根据 HTTP 流量创建和销毁实例。您无法阻止实例的创建或销毁,它是无服务器的。同样,您没有 IP/PORT 关联到您的 Cloud Functions 实例,它是无服务器的。如果您只想拥有 1 个 Cloud Functions 实例,则可以将最大实例设置为 1。但是,请注意,Cloud Functions 一次只能在同一实例上处理 1 个请求。最大实例为 1,如果你有 2 个并发请求,将处理 1 个,另一个将等待,10 秒后将返回 417 HTTP 错误。