Skip to content

项目简介

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
后端 APIGo 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             # 一键起栈

文档导航

基于 MIT License 发布