视频模块功能设计方案 | 青训营笔记

37 阅读4分钟

这是我参与[第五届青训营]伴学笔记创作活动的第16天

主要三个部分

  • 需求介绍
  • 架构设计
  • 功能测试

一、 需求介绍

具体的功能包括视频投稿、发布列表以及视频流。用户在进行刷操作时客户端会进行Feed流的获取并同步当前视频作者的投稿列表。用户可以通过发布按钮将视频发布分享。

1、 视频投稿

接受参数:用户鉴权token、视频流数据data、视频标题title

请求类型:POST /douyin/publish/action

请求体:JSON数据

响应体:状态码status_code 返回状态status_msg

2、 发布列表

接受参数:用户鉴权token、目标用户id

请求类型:GET /douyin/publish/list

请求体:JSON数据

响应体:状态码status_code 返回状态status_msg video_list

3、 视频流

不限制登录状态,返回按投稿时间倒序的视频列表,视频数量由服务端控制,单次最多30个

接受参数:lastest_time(可选参数,限制返回视频的最新投稿时间)、用户鉴权(可选参数)token

请求类型:GET /douyin/feed

请求体:JSON数据

响应体:状态码status_code 返回状态status_msg video_list

二、 架构设计

1、整体架构设计

采用分层架构,客户端发送请求后,首先进行统一鉴权,鉴权成功后controller层对请求层进行响应并解析请求中的数据,将数据传入service层进行数据处理并调用dao层与数据库、FTP服务器进行交互

2、详细设计

(1)视频投稿

登录用户选择视频上传

1 鉴权(判断用户是否登录)

(1)如果已经登录,进入2

(2)如果未登录,则返回status_code=0 status_msg = "投稿失败,您未登录"

2 判断用户视频数据或者视频标题是否为空

(1)只要有一个为空则返回status_code=0 ,status_msg = "投稿失败,请保证填写必要数据"

(2)都不为空,进入3 ,并且返回status_code=1 ,status_msg = "投稿成功"

3把视频数据存放在后台

4添加记录到数据库

5返回给前端status_code status_msg

(2)发布列表

登录用户的视频发布列表,直接列出某个用户所有投稿过的视频。

1 鉴权(判断用户是否登录)

(1)如果已经登录,进入2

(2)如果未登录,则返回status_code=0 status_msg = "请先登录"

2 根据id查询目标用户信息 author

(1)如果查不到则返回status_code=0 status_msg = "目标用户不存在"

(2)如果能查到,则进入3

3.从数据库中查询符合条件的视频

4.封装到video_list中

5返回给前端status_code = 1 status_msg="查询成功" ,video_list

(3)视频流

不限制登录状态,返回按投稿时间倒序的视频列表,视频数由服务端控制,单次最多30个

1.查询前30个最新时间 Video:

问题:(1)如何查询前30个? (2)如何拿到这30个中的最后一个?

2.封装到video_list中

3.返回给前端status_code = 1 status_msg="查询成功"

3、性能优化

3.1概述

在原有的架构中,主要存在两点问题

  • 视频投稿列表存在大量的同步调用,在进行视频信息拼装时,大量同步调用会导致缓慢,用户体验较差
  • 视频和图片存放在本地服务器,耦合性较高。

改进方式如下:

  • 采用go语言的协程将原有同步流程异步化,提升程序性能
  • 为了实现解耦,搭建FTP服务器存储视频资源,并通过SSH的方式远程调用ffmpeg截取视频关键帧
  • 将FTP与SSH的链接方式改为长连接,去掉每次调用方法所需要的初始化时间

暂时无法在飞书文档外展示此内容

3.2优化详细流程

在原有流程中,每次上传视频需要建立FTP链接并验证身份,为提高响应时间建立长链接

为了实现解耦,服务端通过SSH连接远程调用服务器ffmpeg来进行截图,同时在SSH中执行长链接节省登录验证时间

为了提升执行效率,利用go协程将视频截图服务和数据库操作进行异步操作。

暂时无法在飞书文档外展示此内容

三、功能测试

视频-视频投稿

需求:登录用户投稿视频

POST http://localhost:8080/douyin/publish/action/

header : Content-Type multipart/form-data

返回值

{
    "status_code": 0,
    "status_msg": "1_bear1.mp4 uploaded successfully"
}

视频上传后会保存到本地 public 目录中

访问时用 127.0.0.1:8080/static/1_bear1.mp4 即可

视频-视频流

需求:查询最新的30个稿件(并未选择参数lastest_time、token)

GET http://localhost:8080/douyin/feed/

返回值

{
    "status_code": 1,
    "status_msg": "查询成功",
    "video_list": [
        {
            "id": 102,
            "author": {
                "id": 23,
                "name": "葵司",
                "follow_count": 97,
                "follower_count": 90
            },
            "play_url": "zc",
            "cover_url": "sad",
            "favorite_count": 1,
            "comment_count": 1,
            "is_favorite": 1,
            "title": "aaa"
        },
        {
            "id": 101,
            "author": {
                "id": 1,
                "name": "松本一香",
                "follow_count": 72,
                "follower_count": 43
            },
            "play_url": "public\1_bear1.mp4",
            "cover_url": "unknown",
            "title": "test"
        },
        。。。。。相似已省略
    ]
}

视频-发布列表

需求:查询某个用户发布过的所有视频

GET http://localhost:8080/douyin/publish/list?token=曹弘文&userId=1

返回值

{
    "status_code": 1,
    "status_msg": "查询成功",
    "video_list": [
        {
            "id": 1,
            "author": {
                "name": "松本一香",
                "follow_count": 72,
                "follower_count": 43
            },
            "play_url": "public\1_bear1.mp4",
            "cover_url": "unknown",
            "title": "test"
        }
    ]
}

参考资料

gorm.io/zh_CN/docs/…

juejin.cn/post/719246…

www.cnblogs.com/myseries/p/…

blog.csdn.net/qq_36938617…

www.jianshu.com/p/a74d67aa8…

blog.csdn.net/JineD/artic…