-
Notifications
You must be signed in to change notification settings - Fork 80
[功能建议] Alist/OpenList 启动晚于 MediaWarp 时,AlistClient 初始化失败后增加自动重试机制 #119
[功能建议] Alist/OpenList 启动晚于 MediaWarp 时,AlistClient 初始化失败后增加自动重试机制
环境
- MediaWarp:
v0.2.4 - Docker 部署
- OpenList 地址:
http://192.168.31.10:6002 - Emby 地址:
http://192.168.31.10:8096
问题现象
NAS 重启后,MediaWarp 与 OpenList 都由 Docker 自动启动。
如果 MediaWarp 启动得比 OpenList 更早,MediaWarp 初始化 AlistClient 时会访问:
http://192.168.31.10:6002/api/me
此时可能出现:
注册 Alist 客户端 http://192.168.31.10:6002 失败:
获取用户当前信息失败:
Get "http://192.168.31.10:6002/api/me":
dial tcp 192.168.31.10:6002: connect: no route to host
或者:
connect: connection refused
之后 MediaWarp 本身仍然可以正常启动,容器状态也是 running。
但是 AlistClient 没有注册成功,后续播放 AlistStrm 时会出现:
获取 AlistStrm 重定向 URL 失败:
获取 AlistClient 失败:
http://192.168.31.10:6002 未注册到 Alist 客户端列表中
此时 OpenList 实际上已经正常启动并可以访问,但 MediaWarp 不会自动重新注册该 AlistClient。
手动重启 MediaWarp 后,AlistStrm 立即恢复正常。
稳定复现方式
可以不重启整台 NAS,直接模拟启动顺序:
- 停止 OpenList
- 重启 MediaWarp
- 等待 MediaWarp 启动
- 可以看到 AlistClient 注册失败
- 再启动 OpenList
- OpenList 此时已经可以正常访问
- 但 MediaWarp 的 AlistStrm 仍无法正常获取重定向 URL
- 手动重启 MediaWarp 后恢复正常
当前临时解决方案
目前我在 Docker Compose 中给 MediaWarp 增加了启动前的 OpenList 健康检查:
entrypoint: - /bin/sh - -c - | echo "[MediaWarp] 等待 OpenList 就绪..." until wget -q -T 3 -O /dev/null http://192.168.31.10:6002/api/me; do echo "[MediaWarp] OpenList 尚未就绪,5 秒后重试..." sleep 5 done echo "[MediaWarp] OpenList 已就绪,启动 MediaWarp" exec /MediaWarp
已经实际测试:
[MediaWarp] 等待 OpenList 就绪...
wget: can't connect to remote host (192.168.31.10): Connection refused
[MediaWarp] OpenList 尚未就绪,5 秒后重试...
wget: can't connect to remote host (192.168.31.10): Connection refused
[MediaWarp] OpenList 尚未就绪,5 秒后重试...
...
[MediaWarp] OpenList 已就绪,启动 MediaWarp
OpenList 启动并通过 /api/me 检测后,MediaWarp 会继续启动,并且 AlistStrm 可以正常工作。
优化建议
建议 MediaWarp 内部对 AlistClient 初始化失败增加自动重试机制,而不是初始化阶段失败一次后就永久不再注册。
例如:
初始化 AlistClient
↓
失败
↓
记录 WARNING
↓
5 秒后重试
↓
10 秒
↓
20 秒
↓
最大间隔 30 / 60 秒
↓
OpenList 恢复
↓
自动注册 AlistClient
或者可以将初始化失败的 AlistClient 放入后台重试队列,周期性重新尝试初始化。
相比要求用户自行在 Docker Compose 中增加启动等待脚本,这种方式可以从 MediaWarp 内部提高容错能力。
这样不仅可以解决 NAS / Docker 启动顺序问题,也可以提高以下场景中的自恢复能力:
- OpenList 单独重启
- OpenList 升级
- Docker 网络短暂异常
- NAS 启动期间网络尚未完全就绪
- OpenList 启动速度较慢
- OpenList API 暂时无法访问
期望行为
即使 MediaWarp 启动时 OpenList 暂时不可用:
MediaWarp 启动
↓
AlistClient 初始化失败
↓
记录错误,但 MediaWarp 保持运行
↓
后台继续尝试初始化 AlistClient
↓
OpenList 恢复
↓
AlistClient 自动注册成功
↓
AlistStrm 自动恢复
整个过程不需要用户手动重启 MediaWarp。
补充说明
目前已经通过 Docker 环境稳定复现:
停止 OpenList
↓
重启 MediaWarp
↓
MediaWarp 无法连接 OpenList
↓
启动 OpenList
↓
如果不重启 MediaWarp,原本初始化失败的 AlistClient 不会自动恢复
同时,通过在 MediaWarp 启动前循环检测:
http://OpenList:6002/api/me
确认 OpenList 已经可访问后再执行 /MediaWarp,可以规避该问题。
因此推测问题主要发生在 AlistClient 的初始化/注册生命周期:首次初始化失败以后缺少后续重试或重新注册机制。
衷心感谢作者的辛勤付出维护 MediaWarp,非常喜欢这个项目。
顺祝作者万事如意!