我目前有一个Google Cloud Function(用打字稿编写),我需要连接到Redis缓存(我将Redis用作队列/指标收集混合对象),以便为在其他地方运行的工人排队工作。
一切正常,当我涌入redis缓存时,一切都按预期工作,管道执行正常。但是我收到了成千上万的这些错误:
[ioredis] Unhandled error event: Error: read ECONNRESET
它们似乎并没有影响云函数的执行,但是它们是不间断的并且会影响我所有云函数的日志,因为它们都已导入到我的index.ts中。对于那些对此有深刻见解的人,我感到绝望,花了几天的时间尝试着我可以在互联网上找到的所有问题进行修复。
作为参考,我使用的是Azure Redis缓存(高级),当我通过redis-cli连接时,我看到我认为是云功能可以成功启动连接并成功进行身份验证,按预期方式涌入队列,等等。
我有/utils/index.ts
,这是我使用Redis的文件(无其他地方)。我这样导入:
import { _createRedis } from './redis';
const redis = _createRedis();
这是我使用redis的示例函数:
export async function runExtractor(): Promise<any> {
const data = await getActiveProfile();
const pipeline = redis.pipeline();
pipeline.lpush(`profile-extractor:jobs`, JSON.stringify((sanitizeSpec(data))));
const result = await pipeline.exec();
console.log('executed pipeline', { resultCount: result.length });
}
redis.ts内容:
import * as Redis from 'ioredis';
// export const redis = new Redis(6380, 'MYCACHE.redis.cache.windows.net', { tls: true as any, password: 'PASSWORD' });
export const _createRedis = () => {
return new Redis(6380, 'azuresucks.redis.cache.windows.net', { tls: true as any, password: 'PASSWORD' });;
}
如您所见,我一直在摆弄tls设置,将其导出为函数,但是没有任何效果。据我发现,这可能与ioredis与Azure Redis缓存和SSL设置的工作方式有关。这是我所能找到的最接近的问题,但那里的答案对我而言不起作用。 ioredis issue
值得注意的是,我在Google云功能环境之外没有遇到此问题。我正在Google计算引擎上运行这些工作程序,他们正好连接到Redis,并从队列中弹出项目并执行工作。重申一下,一切正常,但这显然是不可取的: stackdriver error reporting