跳转到内容

架构总览

SyncTV 是一个单二进制服务,内部组合 HTTP API、公开 gRPC、management gRPC、实时房间状态、媒体 Provider、媒体代理、直播和集群协调能力。持久状态在 PostgreSQL,跨节点临时状态和分布式协调依赖 Redis,本地运行时文件放在 data_dir

SyncTV 架构总览图,展示客户端、Ingress、SyncTV 单二进制、PostgreSQL、Redis、外部 Provider 和 HLS 存储之间的关系。 SyncTV 架构总览图,展示客户端、Ingress、SyncTV 单二进制、PostgreSQL、Redis、外部 Provider 和 HLS 存储之间的关系。
SyncTV 的核心边界:一个服务进程承载业务 API、实时协作、管理控制面、媒体代理和直播能力,持久状态进入 PostgreSQL,跨节点临时状态进入 Redis。

API 与实时协作

HTTP REST、公开 gRPC、WebSocket 和房间实时事件共享同一套业务服务与权限模型。

身份认证

本地密码、passkey/WebAuthn、邮箱验证码、OAuth2、用户级 2FA 和 JWT token 共同构成登录层。

媒体能力

Provider 负责解析外部媒体,proxy 负责可控转发,slice cache 只缓存 Range slice,不做 full-body cache。

横向扩展

多节点通过 Redis pub/sub、Redis Stream、节点发现和 leader election 同步房间事件与后台任务。

入口默认端口或路径作用生产建议
HTTP RESTserver.port=8080客户端业务 API、健康检查、OpenAPI UI通过反向代理或 Ingress 暴露
公开 gRPCserver.port=8080客户端或 SDK 使用的 gRPC APIKubernetes 中使用独立 Service 和独立 Ingress
WebSocketserver.port=8080房间实时事件、播放同步、聊天等长连接配置连接限制和合理的 shutdown drain
management gRPCUnix socket 或 management.port=50052CLI、管理命令、运维控制面优先 Unix socket;TCP 必须配置 token
metricsmetrics.port=9090Prometheus 指标出口不直接暴露公网,启用鉴权
RTMPlivestream.rtmp_port=1935直播推流入口只在需要直播时放行
STUN UDPwebrtc.stun_port=3478WebRTC NAT 辅助只在需要内置 STUN 时放行

HTTP REST 和公开 gRPC 共享主端口,但在 Kubernetes 中仍建议拆成两个 Service 和两个 Ingress。这样可以给 gRPC Ingress 单独设置 nginx.ingress.kubernetes.io/backend-protocol: "GRPC",也更容易分别做路由、TLS 和观测。

PostgreSQL 是唯一必须持久化的核心状态层。用户、房间、权限、Provider 实例、用户偏好、审计和业务数据都在这里。

生产要求:启动阶段会自动执行 embedded SQLx migrations;必须有备份与恢复流程;数据库连接池大小不能超过数据库和连接代理的容量;回滚前必须确认数据库 migration 是否可逆。

  1. 客户端通过 HTTP 或 gRPC 访问 SyncTV。
  2. API 层完成认证、限流、权限检查和请求解析。
  3. 业务服务读写 PostgreSQL,并按需使用 Redis/L1 缓存。
  4. 实时变更通过 WebSocket 推送给房间成员;集群模式下通过 Redis 同步到其他节点。
  1. Provider 根据实例配置解析媒体地址,并决定返回直连地址还是代理地址。
  2. Provider 明确声明上游请求需要哪些 header,例如 User-AgentRefererRange 或认证 header。
  3. proxy 底层只使用 Provider 给出的 header,不自行转发原始客户端 header。
  4. slice cache 只处理支持 Range 的上游响应;上游不支持 Range 时直接 bypass,不缓存完整响应体。

集群模式适合多副本部署。开启 cluster.enabled=true 后,Redis 和 server.cluster_secret 都是必需项。

关键配置:

配置作用
cluster.discovery_mode节点发现方式,支持 redisstatick8s_dns
cluster.leader_election_mode后台任务 leader 选举方式,支持 redisk8s_lease
server.advertise_host其他节点连接当前节点时使用的地址
server.cluster_secret节点间 gRPC 调用认证
cluster.catchup_window_secs节点短暂断开后从 Redis Stream 补事件的窗口

多副本时还要确认:

  • 所有副本共享同一个 PostgreSQL。
  • 所有副本共享同一个 Redis 和 redis.key_prefix
  • HLS 跨节点访问可以走 publisher-node proxy;高流量生产场景建议使用共享文件系统或 OSS,减少 publisher 节点压力。
  • Pod 关闭时给足 server.shutdown_drain_timeout_seconds 和 Kubernetes termination grace period。

更完整的运行时设计、发现模式、leader election 和集群直播边界见 集群配置

直播路径和点播 proxy 路径不同。RTMP 是推流入口;HTTP-FLV 面向低延迟播放;HLS 通过 remuxer 生成 playlist/segment 并写入 memoryfileoss backend。多副本时,publisher 所在节点通过共享 registry 暴露给其他节点;非 publisher 节点可以通过 HLS gRPC proxy 向 publisher 节点读取分片,也可以在共享文件系统或 OSS 模型下直接读取分片。

详细的 RTMP/StreamHub/HTTP-FLV/HLS pipeline、backend 选择和集群直播故障边界见 直播与 HLS/FLV

最小生产拓扑:

最小生产拓扑图,展示客户端经 TLS 反向代理或 Ingress 访问 SyncTV,SyncTV 连接 PostgreSQL 和 Redis。 最小生产拓扑图,展示客户端经 TLS 反向代理或 Ingress 访问 SyncTV,SyncTV 连接 PostgreSQL 和 Redis。
最小生产拓扑只需要一个 SyncTV 服务入口、PostgreSQL 和 Redis。Redis 在简单单节点场景可选,但生产建议配置。

Kubernetes 多副本拓扑:

Kubernetes 多副本拓扑图,展示 HTTP Ingress、gRPC Ingress、两个独立 Service、多个 SyncTV Pod、PostgreSQL、Redis、HLS backend 或 publisher-node proxy,以及外部媒体 Provider。 Kubernetes 多副本拓扑图,展示 HTTP Ingress、gRPC Ingress、两个独立 Service、多个 SyncTV Pod、PostgreSQL、Redis、HLS backend 或 publisher-node proxy,以及外部媒体 Provider。
Kubernetes 多副本部署应拆分 HTTP 与 gRPC 的 Service/Ingress,同时让所有 Pod 共享 PostgreSQL、Redis。HLS 可以使用 publisher-node proxy;高流量生产建议使用共享文件系统或 OSS。