项目简介
Vistack 是一个面向高并发场景的分布式视频平台,同时支持 实时直播(Live Streaming) 与 视频点播(VOD)。
项目以「高并发、可水平扩展」为核心设计目标,实践了一套云原生的分布式转码与流媒体架构:
- 任务队列解耦:Kafka 分发转码 / 删除 / 弹幕 / 评论等异步任务;
- gRPC 远程转码:FFmpeg 隔离在独立的 transcoder 容器,通过 gRPC
ProcessVideo调用,无状态、可任意副本接任务; - etcd 服务发现:transcoder / auth 实例向 etcd 注册并保活,worker 经 etcd 动态发现 + gRPC
round_robin负载均衡; - 对象存储分发:MinIO(S3 兼容)承载原片、DASH 分片与封面,带宽卸载到对象存储;
- 全部一键容器化:Docker Compose 起栈,附 Kubernetes 清单。
此外,项目还内置了一套高并发应用层能力——Redis 缓存三件套、分布式限流、点赞/收藏/播放量计数与热门榜单,覆盖面试高频的「高并发场景题」。
🎯 在线体验:https://vistack.pages.dev
核心特性
视频点播(VOD)
| 能力 | 说明 |
|---|---|
| 分片上传 + 秒传 | MinIO Multipart 直传 + 文件哈希去重,支持断点续传 |
| 自适应码率(DASH ABR) | FFmpeg 按源分辨率智能选择 240p–4K 档位,manifest.mpd + init-*.m4s / chunk-*.m4s 分片,前端 dash.js 无缝切换清晰度 |
| 远程转码服务 | FFmpeg 隔离在独立容器,通过 gRPC ProcessVideo 调用,输入/输出均走 MinIO,无状态可扩容 |
| 防盗链 | 预签名 URL / STS 临时凭证鉴权 |
直播(Live)
- 基于 live777(Rust SFU) 的 WebRTC 分发,服务端轻量、高并发;
- OBS 推流 → 多端拉流。
分布式与可扩展
- 多角色拆分:
api/worker/transcoder/auth四个进程独立部署、独立扩容(单二进制 + role 分发); - 任务队列:Kafka 分发转码 / 删除任务,Redis ZSet 指数退避重试 + Watchdog 超时兜底;
- 服务发现:transcoder 实例向 etcd 注册并保活,worker 经 etcd 动态发现 + gRPC
round_robin负载均衡; - 领导选举:retry dispatcher 与 watchdog 通过 etcd 领导选举保证全局单例;
- 容器化 & 云原生:Docker Compose 一键起栈,附 Kubernetes 清单。
安全与权限
- 独立 Auth 服务:RS256 + JWKS 无状态验签、注册/登录/资料、用户 gRPC 查询;
- JWT 认证、RBAC 细粒度权限(
authorities+ 角色/用户两级授权)、推流密钥校验。
高并发能力
- Redis 缓存层:Cache-Aside 通用组件,穿透(空值缓存 + 布隆过滤器)、击穿(singleflight + Redis 互斥锁)、雪崩(随机 TTL)三件套,接入视频详情与推荐列表;
- 分布式限流:登录后接口按用户 ID 限流,令牌桶(单机)+ Redis Lua 滑动窗口(分布式)两种算法可配置切换,429 +
Retry-After+X-RateLimit-*,Redis 不可用 fail-open; - 点赞/收藏/播放量:Redis Set 去重计数 + 播放
INCR,Lua 原子 toggle、事件队列异步批量落库(幂等),videos冗余计数列 + 明细表,ZSet 热门榜单; - 弹幕 / 评论:敏感词过滤 + 本地 LRU → Redis → DB 三级缓存,事件队列异步批量落库。
技术栈
| 层级 | 技术 |
|---|---|
| 前端 | Vue 3 + Pinia + Tailwind CSS + dash.js / Video.js |
| 后端 API | Go 1.26 + Gin + GORM + PostgreSQL + Redis |
| 认证 | 独立 Auth 服务(RSA RS256 + JWKS + gRPC 用户查询) |
| 缓存 | Redis Cache-Aside(穿透/击穿/雪崩 + 布隆过滤器) |
| 限流 | 令牌桶(单机)+ Redis Lua 滑动窗口(分布式) |
| 社交互动 | Redis Set/INCR 计数 + 异步批量落库 + ZSet 榜单 |
| 服务通信 | gRPC + Protobuf(buf 生成) |
| 服务发现 | etcd |
| 任务队列 | Kafka(segmentio/kafka-go)+ Redis 延迟队列 |
| 转码 | FFmpeg / FFprobe(独立 transcoder 容器) |
| 对象存储 | MinIO(S3 兼容) |
| 直播 | live777(Rust SFU) |
| 部署 | Docker Compose / Kubernetes / Traefik 网关 |
| 可观测性 | zap 结构化日志(预留 Prometheus/Grafana) |
目录结构
Vistack
├── cmd/vistack/ # 入口:按 VISTACK_ROLE 分发 api/worker/transcoder/auth/migrate
├── internal/
│ ├── role/ # 多角色启动引导
│ ├── api/v1/ # HTTP 处理器
│ ├── routers/ # 路由与中间件注册
│ ├── core/ # DB/Redis/MinIO/Kafka/Snowflake 等基础设施封装
│ │ ├── cache/ # 通用缓存组件(穿透/击穿/雪崩 + 布隆过滤器)
│ │ ├── message_queue/ # transcode(worker/retry/watchdog)、video(删除)、danmaku、comment
│ │ └── leader/ # etcd 领导选举(单例任务)
│ ├── middlewares/ # auth/cors/requestid/ratelimit
│ │ └── ratelimit/ # 令牌桶(单机)+ Redis 滑动窗口(分布式)
│ ├── interaction/ # 点赞/收藏/播放量计数 + 榜单 + 异步落库
│ ├── danmaku/ # 弹幕(敏感词 + 三级缓存 + 异步落库)
│ ├── comment/ # 评论(父子结构 + 附件 + 审核)
│ ├── auth/ # Auth 服务(HTTP + gRPC)
│ ├── authclient/ # Auth 用户查询客户端
│ ├── transcoder/ # gRPC 转码服务 + ffmpeg 逻辑 + etcd 注册
│ ├── discovery/ # etcd → gRPC resolver 服务发现
│ ├── config/ # 配置结构(Viper)
│ └── model/entity/ # GORM 实体
├── proto/transcoder/v1/ # gRPC 契约(buf)
├── migrations/ # GORM 自动迁移
├── conf/ # app.toml / app.local.toml / app.docker.toml 配置
├── deploy/ # Kubernetes 清单 + Traefik 网关配置
├── web/ # pnpm monorepo:ui / web-client / web-admin
├── Dockerfile # 双 target:vistack / vistack-transcoder
└── compose.yml # 一键起栈