Skip to content

通知系统

rust-srec 内置了灵活且强大的通知系统,用于实时通报直播状态、系统错误和任务进度。

系统架构

通知系统基于事件驱动模式构建。当系统内发生重要变更时,相应的组件会发布一个事件,NotificationService 订阅这些事件并根据配置转发至不同的渠道(Channels)。

通知渠道 (Channels)

目前支持以下通知渠道:

渠道描述典型配置
Discord通过 Discord Webhook 发送格式化消息。Webhook URL, 用户名, 头像
Email通过 SMTP 发送电子邮件通知。SMTP 服务器, 端口, 账号/密码
Webhook发送自定义 JSON POST 请求到指定 URL。目标 URL, 自定义 Headers

基础设施关键事件

以下两个事件会在录制文件系统本身出现问题时触发:

事件触发时机能否自动恢复?
out_of_space预警:磁盘使用率超过配置阈值,但录制仍在运行。不适用(仅预警)
output_path_inaccessible输出根写入门已实际阻止录制,原因是 create_dir_all 或中途写入时遇到 ENOENT / ENOSPC / EACCES / EROFS / 超时等错误。每次 Healthy → Degraded 状态切换只发出一次(不是每次失败都发)。真正的 ENOSPC:是,磁盘释放后约 30 秒内自动恢复。失效的 Docker 绑定挂载:,必须重启容器。详见 Docker 故障排查

设置环境变量 RUST_SREC_LOCALE 后,所有通知事件都会按语言本地化——直播上/下线、录制生命周期、分段、流水线任务、系统告警、凭据事件——并通过所有外部渠道(Telegram、Gotify、Discord、Webhook、邮件、Web Push)按配置语言下发。目前支持:enzh-CN。此外,output_path_inaccessible 的描述还会根据底层 io::ErrorKind 分支——NotFound(挂载失效)会显示与 StorageFull(磁盘真正写满)不同的恢复建议。

优先级与过滤

并非所有事件都需要立即通知。系统引入了 NotificationPriority 对事件进行分级:

  • Critical (严重): 会阻塞录制的系统级故障(output_path_inaccessiblefatal_errorpipeline_queue_critical)。
  • High (高): 重要警告,录制可能仍能继续(out_of_spacedownload_rejected)。
  • Normal (中): 上下线事件、管道生命周期、系统启停。
  • Low (低): 细粒度状态变化、分段级进度(通常会被过滤)。

您可以在配置中设置 min_priority,仅接收高于该级别的通知。

可靠性保证

为了确保通知在网络波动下仍能送达,系统具备以下机制:

  1. 重试机制:失败的通知会进入重试队列,采用指数退避算法(Exponential Backoff)。
  2. 熔断机制 (Circuit Breaker):如果某个渠道持续失败(如 Webhook 链接失效),系统会自动熔断该渠道,防止无效重试消耗系统资源。
  3. 死信队列 (Dead Letter Queue):多次重试仍失败的通知将被存入死信队列,您可以通过 API 查看失败原因。

配置示例

在全局配置或平台配置中启用通知:

json
{
  "notifications": {
    "enabled": true,
    "min_priority": "info",
    "channels": [
      {
        "type": "discord",
        "webhook_url": "https://discord.com/api/webhooks/..."
      }
    ]
  }
}

提示

您可以为主播设置不同的通知策略。例如,给特别重要的主播设置高优先级的通知,甚至使用不同的 Webhook 渠道。

Released under the MIT License.