这是我参与「第五届青训营 」伴学笔记创作活动的第 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截图执行协程通过并发的执行截图操作,提升服务效率,同时,失败的任务将会放入任务通道中,再次排队准备执行.
解耦视频处理和投稿请求
在我们现有的系统中, 利用了Go的ffmpeg库进行音视频的处理和截图, 与用户的上传请求属于同步调用, 如果音视频体积较大则很可能导致用户等待时间过长. 在这个请求过程中, 音视频处理时延占比较大, 故考虑调用第三方音视频服务器进行处理. 通过SSH远程调用命令行的方式, 将服务端和视频服务器进行解耦, 同时在SSH中执行长链接节省登录验证的时间.
反思与总结
Go语言是一个并发友好的语言, 在开发的过程中体现的尤为鲜明, 用简单优雅的方式实现轻量级的线程的创建和管理. 与传统的系统级线程和进程相比,协程的最大优势在于其“轻量级”,可以轻松创建上百万个而不会导致系统资源衰竭,而线程和进程通常最多也不能超过1万个. 所以利用好Go语言的并发优秀的特性, 可以创造出更快更可读更易维护的Web应用.