StackStorm Sensor连接Redis时出现SSL超时错误的排查求助
问题原因
这个报错是StackStorm Sensor组件依赖的eventlet协程库和Redis SSL长连接的兼容问题:
- 普通Action为短连接执行逻辑,请求完成后立即断开Redis连接,不会触发超时判断,所以运行正常
- Sensor组件的Redis pubsub订阅为长连接模式,空闲等待消息时会让出协程调度,eventlet封装的绿色SSL套接字会在等待数据超过阈值时主动抛出SSL超时错误
- 你之前尝试的eventlet历史修复方案没有覆盖Redis pubsub场景下的空闲长连接逻辑,所以不生效
可行解决方案
方案1:调整Redis客户端连接参数
在Sensor初始化Redis客户端的代码中,显式关闭socket读超时、开启TCP长连接保活:
import socket import redis # 初始化Redis客户端时新增以下参数 redis_client = redis.Redis( host="<你的Redis地址>", port=6379, ssl=True, # 关键配置:pubsub长连接关闭读超时 socket_timeout=None, socket_connect_timeout=30, # 开启TCP保活,避免中间网关断开空闲连接 socket_keepalive=True, socket_keepalive_options={ socket.TCP_KEEPIDLE: 60, socket.TCP_KEEPINTVL: 10, socket.TCP_KEEPCNT: 5 } ) pubsub = redis_client.pubsub(ignore_subscribe_messages=True)
方案2:禁用eventlet对SSL模块的猴子补丁
在Sensor代码的最顶部(所有其他import语句之前)添加以下代码,绕过eventlet的SSL封装:
import eventlet # 仅禁用SSL模块的补丁,不影响其他协程能力 eventlet.monkey_patch(ssl=False)
方案3:用独立线程运行pubsub订阅逻辑
避开eventlet协程调度的影响,单独启动一个原生线程执行Redis订阅逻辑,收到消息后再抛给Sensor的处理逻辑即可。
方案4:调整Redis服务端配置
检查Redis服务端配置,将tcp-keepalive参数调整为60s,ssl_timeout设置为0(不主动断开空闲SSL连接),避免服务端主动切断Sensor的长连接。
内容的提问来源于stack exchange,提问作者shellHell
相关产品推荐
相关产品推荐

