Skip to content

Navigation Menu

Sign in
Sign up

[功能建议] Alist/OpenList 启动晚于 MediaWarp 时,AlistClient 初始化失败后增加自动重试机制 #119

Unanswered
WuLongMiTaoLaiYiDa asked this question in Q&A
Discussion options

[功能建议] 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,直接模拟启动顺序:

  1. 停止 OpenList
  2. 重启 MediaWarp
  3. 等待 MediaWarp 启动
  4. 可以看到 AlistClient 注册失败
  5. 再启动 OpenList
  6. OpenList 此时已经可以正常访问
  7. 但 MediaWarp 的 AlistStrm 仍无法正常获取重定向 URL
  8. 手动重启 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,非常喜欢这个项目。

顺祝作者万事如意!

You must be logged in to vote

Replies: 0 comments

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Category
Q&A
Labels
None yet
1 participant

AltStyle によって変換されたページ (->オリジナル) /