Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google cloud platform Firebase功能与同一VPC中的GCP Redis实例的连接持续断开_Google Cloud Platform_Redis_Google Cloud Functions - Fatal编程技术网

Google cloud platform Firebase功能与同一VPC中的GCP Redis实例的连接持续断开

Google cloud platform Firebase功能与同一VPC中的GCP Redis实例的连接持续断开,google-cloud-platform,redis,google-cloud-functions,Google Cloud Platform,Redis,Google Cloud Functions,我正在开发多个Firebase云功能(所有功能都托管在同一地区),这些功能使用VPC连接器与同一地区的GCP托管Redis实例连接。我正在使用适用于Redis的nodejs库的3.0.2版。在云函数的调试日志中,我看到频繁的连接重置日志,为每个云函数触发,在连接重置的时间线周围没有固定的模式。每次,错误事件处理程序中捕获的错误都是EconReset。在创建Redis实例时,我提供了一种重试策略,可以在5毫秒后重新连接,最多10次这样的尝试,并将重试未执行的命令设置为true,期望在连接重置时自动

我正在开发多个Firebase云功能(所有功能都托管在同一地区),这些功能使用VPC连接器与同一地区的GCP托管Redis实例连接。我正在使用适用于Redis的nodejs库的3.0.2版。在云函数的调试日志中,我看到频繁的连接重置日志,为每个云函数触发,在连接重置的时间线周围没有固定的模式。每次,错误事件处理程序中捕获的错误都是EconReset。在创建Redis实例时,我提供了一种重试策略,可以在5毫秒后重新连接,最多10次这样的尝试,并将重试未执行的命令设置为true,期望在连接重置时自动重试任何未执行的命令(请参阅下面的代码)

以下是我面临的问题

  • 为什么会间歇性地重置连接
  • 我看到的日志表明,即使正在执行云功能,与Redis服务器的连接也会丢失,从而导致命令失败
  • 当retry_unfulled_命令设置为true时,我希望它能够处理上面第2点提到的场景,但是根据调试日志,在这种场景中云函数超时。这是我在那个案例的日志中观察到的
  • 我是否应该尝试在每次这样的Redis操作期间创建一个连接,而不是在全局级别创建一个Redis连接实例?它可能会有一些性能问题以及并发Redis连接的数量问题(因为我有多个云函数,所有这些都将为每次同时调用创建Redis连接),对吗

  • 所以,如何最好地处理它,因为我在开发过程中遇到了所有这些问题,所以不确定这是与代码相关的问题还是与基础架构配置相关的问题。

    这种行为可能是由后台活动引起的

    “后台活动是指函数运行后发生的任何事件 终止“

    当后台活动干扰云函数中的后续调用时,可能会发生难以诊断的意外行为和错误。函数终止后访问网络通常会导致“EconReset”错误

    要解决此问题,请确保没有后台活动,方法是在表示调用已完成的行之后搜索日志中的条目。后台活动有时可以深入到代码中,特别是当存在回调或计时器等异步操作时。检查代码,确保在终止函数之前完成所有异步操作


    此行为可能由后台活动引起

    “后台活动是指函数运行后发生的任何事件 终止“

    当后台活动干扰云函数中的后续调用时,可能会发生难以诊断的意外行为和错误。函数终止后访问网络通常会导致“EconReset”错误

    要解决此问题,请确保没有后台活动,方法是在表示调用已完成的行之后搜索日志中的条目。后台活动有时可以深入到代码中,特别是当存在回调或计时器等异步操作时。检查代码,确保在终止函数之前完成所有异步操作


    您是在使用Memorystore for Redis,还是您的Redis托管在GCE实例或GKE上?您还可以与我们分享您正在使用的Redis版本以及EconReset错误的完整日志条目。我正在使用Redis的Memorystore。版本为4.0(基本层)。我在云函数日志中没有看到任何其他日志,除了作为ECONNRESET记录的错误。有没有办法增强Redis日志记录?您是使用Memorystore for Redis,还是您的Redis托管在GCE实例或GKE上?您还可以与我们分享您正在使用的Redis版本以及EconReset错误的完整日志条目。我正在使用Redis的Memorystore。版本为4.0(基本层)。我在云函数日志中没有看到任何其他日志,除了作为ECONNRESET记录的错误。有没有一种方法可以增强Redis日志记录?我有一种预感,这可能是一个问题,直到很久以前确实如此。我试图解决所有这些问题,并检查了日志,也没有这样的背景活动发生,但仍在观察这个问题。现在,我已经删除了Redis的全局实例,并在需要时(在每次操作期间)创建它。我已经2-3天没有观察到EconReset错误了。我很高兴听到您能够解决您的问题。我有一种预感,这可能是问题所在,直到不久前确实如此。我试图解决所有这些问题,并检查了日志,也没有这样的背景活动发生,但仍在观察这个问题。现在,我已经删除了Redis的全局实例,并在需要时(在每次操作期间)创建它。我已经2-3天没有观察到EconReset错误。我很高兴听到您能够解决您的问题。
    const redisLib = require('redis');
    const client = redisLib.createClient(REDIS_PORT, REDIS_HOST, {
        enable_offline_queue: true,
        retry_unfulfilled_commands: true,
        retry_strategy: function(options) {
            if (options.error && options.error.code === "ECONNREFUSED") {
              // End reconnecting on a specific error and flush all commands with
              // a individual error
              return new Error("The server refused the connection");
            }
    
            if (options.attempt > REDIS_CONNECTION_RETRY_ATTEMPTS) {
              // End reconnecting with built in error
              console.log('Connection retry count exceeded 10');
              return undefined;
            }
    
            // reconnect after 5 ms
            console.log('Retrying connection after 5 ms');
            return 5;
          },
    });
    
    client.on('connect', () => {
        console.log('Redis instance connected');
    });
    
    client.on('error', (err) => {
        console.error(`Error connecting to Redis instance - ${err}`);
    });
    
    exports.getUserDataForId = (userId) => {
        console.log('getUserDataForId invoked');
        return new Promise((resolve, reject) => {
            if(!client.connected) {
                console.log('Redis instance not yet connected');
            } 
            
            client.get(userId, (err, reply) => {
                if(err) {
                    console.error(JSON.stringify(err));
                    reject(err);
                } else {
                    resolve(reply);
                }
            });
        });
    }
    
    // more such exports for different operations
    
    getUserDataForId invoked
    Retrying connection after 5 ms
    Redis instance connected
    Function execution took 60002 ms, finished with status: 'timeout' --> coming from wrapper cloud function