azure - 来自 Azure 应用服务的 ioredis ETIMEDOUT,但在本地工作正常,IP 已添加到防火墙
问题描述
我有一个正在测试的 Azure Redis 缓存。除了我现在正在尝试做的事情之外,它没有被使用/没有任何东西连接到它。它是最基本的 C0 计划的一部分。
问题是,一旦部署为 Azure 应用服务的一部分,它将不断抛出:
[ioredis] Unhandled error event: Error: connect ETIMEDOUT
at TLSSocket. (/home/site/wwwroot/node_modules/ioredis/built/redis/index.js:282:31)
at Object.onceWrapper (events.js:273:13)
at TLSSocket.emit (events.js:182:13)
at TLSSocket.Socket._onTimeout (net.js:449:8)
at ontimeout (timers.js:425:11)
at tryOnTimeout (timers.js:289:5)
at listOnTimeout (timers.js:252:5)
at Timer.processTimers (timers.js:212:10)
如果我在本地运行应用程序,一切都很好并且工作正常。我也将我的本地 IP 和应用程序服务的 IP 添加到了防火墙中。
我的配置是:
host: this.get('REDIS_HOST'),
port: 6380,
password: this.get('REDIS_PRIMARY_KEY'),
tls: true as any,
connectTimeout: 1000,
和
import * as redis from 'ioredis';
redis: redis.Redis;
in constructor:
this.redis = new redis(this.configService.getRedis());
解决方案
我试图在我的环境中重现您的问题,然后我发现它似乎是由于该connectTimeout
值太短并且比下面定义10000
的默认值短。connectTimeout
export const DEFAULT_REDIS_OPTIONS: IRedisOptions
export const DEFAULT_REDIS_OPTIONS: IRedisOptions = {
// Connection
port: 6379,
host: "localhost",
family: 4,
connectTimeout: 10000,
//.....
}
如果我使用or设置connectTimeout
值,我会在我的环境中遇到与您相同的问题,如下图所示。1000
100
所以请尝试删除该connectTimeout
属性并使用默认值,或者只是设置一个比默认值更长的超时值。
推荐阅读
- wso2esb - 在 WSO2 中将 POX 转换为 SOAP 消息
- regex - 正则表达式查找唯一字符串
- xamarin.forms - 来自 app.xaml.cs 的 xamarin.forms 通知点击和导航
- azure-data-factory - 尝试使用数据流接收器更新行时出现无效的列名错误
- c++ - 从资源 id 获取 CButton 控件名称?
- hyperledger-fabric - 如何在 Hyperledger 中创建通道块
- excel - Excel 在 VBA 中使用 SmartArtLayout 一直运行缓慢?
- node.js - 从 Playstore 下载离子应用程序时,它无法在真实设备 android 9 中运行
- jenkins - Android Jenkins 日志显示“settings_apk-debug.apk:没有这样的文件或目录”
- c# - WebAPI 限制最佳实践