微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Redis 和谷歌云函数

如何解决Redis 和谷歌云函数

我正在使用 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 小时或更短时间后通过 Redis 服务器配置关闭空闲连接。 (Cloud Functions 实例通常会在 30 分钟不活动后卸载,无需任何 Google Cloud 承诺。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。