Google cloud platform Firebase功能与同一VPC中的GCP Redis实例的连接持续断开
我正在开发多个Firebase云功能(所有功能都托管在同一地区),这些功能使用VPC连接器与同一地区的GCP托管Redis实例连接。我正在使用适用于Redis的nodejs库的3.0.2版。在云函数的调试日志中,我看到频繁的连接重置日志,为每个云函数触发,在连接重置的时间线周围没有固定的模式。每次,错误事件处理程序中捕获的错误都是EconReset。在创建Redis实例时,我提供了一种重试策略,可以在5毫秒后重新连接,最多10次这样的尝试,并将重试未执行的命令设置为true,期望在连接重置时自动重试任何未执行的命令(请参阅下面的代码) 以下是我面临的问题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,期望在连接重置时自动
所以,如何最好地处理它,因为我在开发过程中遇到了所有这些问题,所以不确定这是与代码相关的问题还是与基础架构配置相关的问题。这种行为可能是由后台活动引起的 “后台活动是指函数运行后发生的任何事件 终止“ 当后台活动干扰云函数中的后续调用时,可能会发生难以诊断的意外行为和错误。函数终止后访问网络通常会导致“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