Redis 和 Google 云函数

Redis and Google Cloud Functions

我正在使用 ioredisset 值到 redis 企业实例。

  1. 如何在几秒钟后关闭连接以减少创建的客户端数量?
  2. 我是否需要关闭连接?
  3. 是否每次调用都会产生一个 Redis 客户端?
  4. 我需要 VPC 连接器吗?
  5. 如何确保函数在同一个 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 云承诺)。

  1. 是;如果你查看你的 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 询问),但目标服务器在您的项目内部。您只能路由内部流量。

  2. Cloud Functions 服务根据 HTTP 流量创建和销毁实例。您无法阻止实例的创建或销毁,它是无服务器的。同样,您没有 IP/PORT 关联到您的 Cloud Functions 实例,它是无服务器的。如果您只想拥有 1 个 Cloud Functions 实例,则可以将最大实例设置为 1。但是,请注意,Cloud Functions 一次只能在同一实例上处理 1 个请求。最大实例为 1,如果你有 2 个并发请求,将处理 1 个,另一个将等待,10 秒后将返回 417 HTTP 错误。