后端基础day15 大项目演进2 | 青训营笔记

65 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天

thrift结构

struct User {
    1:  i64 id
    2:  string name
    3:  i64 follow_count    //关注数量
    4:  i64 follower_count  //粉丝数量
    5:  bool is_follow      //是否以及被本用户关注
}

struct Video {
    1:  i64 id
    2:  User author        //作者
    3:  string play_url    //视频url
    4:  string cover_url   //封面url
    5:  i64 favorite_count //喜欢数量
    6:  i64 comment_count  //评论数量
    7:  bool is_favorite   //是否被本用户喜欢
    8:  string title       //标题
}

struct Comment {
    1:  i64 id
    2:  User user            //评论用户
    3:  string content       //内容
    4:  string create_date   //创建时间
}

struct Message{
    1: i64 id
    2: i64 to_user_id        //接受方id
    3: i64 from_user_id      //发送方id
    4: string content        //内容
    5: string create_time    //创建时间
}

视频封面截图任务分发

在我们的视频处理中, 使用的是go的ffmpeg库. 截图过程中可能有CPU空闲, 所以考虑通过实现一个go任务分发协程来进行任务分发,流量控制,go截图执行协程通过并发的执行截图操作,提升服务效率,同时,失败的任务将会放入任务通道中,再次排队准备执行.

image.png

解耦视频处理和投稿请求

在我们现有的系统中, 利用了Go的ffmpeg库进行音视频的处理和截图, 与用户的上传请求属于同步调用, 如果音视频体积较大则很可能导致用户等待时间过长. 在这个请求过程中, 音视频处理时延占比较大, 故考虑调用第三方音视频服务器进行处理. 通过SSH远程调用命令行的方式, 将服务端和视频服务器进行解耦, 同时在SSH中执行长链接节省登录验证的时间.

image.png

反思与总结

Go语言是一个并发友好的语言, 在开发的过程中体现的尤为鲜明, 用简单优雅的方式实现轻量级的线程的创建和管理. 与传统的系统级线程和进程相比,协程的最大优势在于其“轻量级”,可以轻松创建上百万个而不会导致系统资源衰竭,而线程和进程通常最多也不能超过1万个. 所以利用好Go语言的并发优秀的特性, 可以创造出更快更可读更易维护的Web应用.