Skip to content

评论系统

评论模块(internal/comment)支持父子结构评论附件敏感词审核异步批量落库,与互动模块共用「Redis 实时 + 异步落库」的节奏。

数据模型

说明
video_comments评论主表(parent_id 支持父子结构)
comment_likes评论点赞(复合主键)
files附件(评论图片等,复用通用文件表)

整体流程

text
发送评论 ──▶ 敏感词过滤(AC 自动机)
              ├─ 命中 → 拒绝(或标记待审核)

        写 Redis(实时可见 + 计数)

        投 Kafka[comment](异步落库)

        worker 消费 → 事务写 DB(幂等)

核心设计

1. 父子评论

  • video_comments.parent_idNULL 表示根评论,非空表示回复;
  • 查询时按视频加载根评论 + 子评论,前端展示树形结构。

2. 敏感词审核

  • 复用弹幕系统的 AC 自动机敏感词过滤器(internal/comment/moderation.go);
  • 发送评论时 filter.Contains(content) 命中即拒绝(与弹幕一致的 ErrSensitive 语义)。

3. 异步批量落库

与点赞/播放量相同的 Flusher 模式

go
// internal/comment/counter.go
type Flusher struct {
    rdb    *redis.Client
    db     *gorm.DB
    opts   Options  // FlushInterval(5s) / FlushBatch(200)
}
  • 评论先写 Redis(实时展示),事件入队;
  • Flusher 每 flush_interval 秒或满 flush_batch 条,批量事务落库;
  • 事件带 snowflake ID 幂等去重。

4. 评论计数

  • Redis 维护视频评论数(comment:count:{videoID});
  • 展示时读取 Redis,异步同步回 videos 表冗余列。

5. 附件

  • 评论可携带附件(图片),复用通用 files 表(RefType = video_comment 等);
  • 上传走 MinIO 预签名直传,与视频上传同一套文件基建。

接口

方法路径说明
POST/api/v1/videos/{id}/comments发表评论 / 回复
GET/api/v1/videos/{id}/comments分页拉取评论树
DELETE/api/v1/comments/{id}删除评论
POST/api/v1/comments/{id}/like评论点赞

配置

toml
[comment]
enabled = true
flush_interval = 5     # 落库间隔(秒)
flush_batch = 200      # 批量落库阈值

演进方向

  • 评论审核流(人工审核 + 自动机分层);
  • 评论排序(热度 / 时间两种模式);
  • 评论 @ 提及与通知。

基于 MIT License 发布