基础版本抖音(字节跳动青训)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 Tair(兼容Redis),内存型 2GB
简介: 本抖音项目是基于grpc通讯协议开发的高性能微服务,不仅使用gin作为业务层框架,gorm框架作为持久层框架,还使用预编译sql防止sql注入,同时该项目结合连接池技术来构建连接工厂和复用grpc连接来提高系统的性能,这样可以有效的处理高并发场景下的挑战,还可以通过减少频繁创建和销毁grpc连接带来的性能开销

抖音基础版(字节跳动青训项目)

一、项目介绍

  • 本抖音项目是基于grpc通讯协议开发的高性能微服务,不仅使用gin作为业务层框架,gorm框架作为持久层框架,还使用预编译sql防止sql注入,同时该项目结合连接池技术来构建连接工厂和复用grpc连接来提高系统的性能,这样可以有效的处理高并发场景下的挑战,还可以通过减少频繁创建和销毁grpc连接带来的性能开销
  • 项目服务地址:https://1024code.com/codecubes/jpyi9rm
  • 项目地址:https://github.com/fineCoderWithLove/douyin-base
  • 项目总评优秀奖,排名(7/367)

    二、项目实现

    2.1技术选型

  • gin:提供grpc服务使用protobuf进行数据传输。
  • JWT:token生成和权限的校验
  • Gorm:对Mysql执行ORM操作,Go-redis:操作Redis对频繁更改的数据进行缓存以便更快的响应。
  • Redis:对点赞/取消赞,视频的喜欢量/评论量,用户的喜欢量,总点赞量缓存Redis中,设置定时任务,并且使数据同步到数据库中。
  • Zap:高性能日志打印
  • ffmpeg:进行视频取帧,作为视频的封面
  • 七牛云:使用七牛云做对象存储,用来存储视频,图片等静态资源。
  • pprof:使用pprof进行性能测试

    2.2架构设计

    由于项目的耦合度不高,所以采用微服务架构来缓解服务器的压力,项目分为api层,业务服务层,数据层

  • api层负责鉴权和分发请求调用远程服务来返回数据
  • 业务层负责与数据库进行交互和逻辑处理

在这里插入图片描述

2.3代码目录介绍

├─base-service # 基础服务
│  ├─cmd # 启动类  
│  ├─global # 定义全局信息
│  │  └─constant # 定义全局常量
│  ├─handler # 业务处理
│  ├─model # 定义常用结构体
│  │  └─video
│  ├─proto # proto文件
│  │  └─favorite
│  ├─test # 测试类
│  ├─util # 封装工具类
│  └─videoproto # 视频的proto文件
├─douyin-api # 外部网关
│  ├─api # grpc服务调用
│  ├─cmd # 启动类
│  ├─global # 定义全局变量
│  ├─globalinit # 定义全局日志信息
│  │  └─constant
│  ├─proto # proto文件
│  ├─redis # 封装redis工具类
│  ├─router # 加载路由信息
│  └─util # 封装工具类
├─interaction-service # 互动模块
│  ├─dao # gen代码生成器
│  │  └─gen
│  ├─global # 定义全局信息
│  │  └─constant
│  ├─handler # 处理业务信息
│  ├─model # 定义常用结构体
│  ├─proto # proto文件
│  │  ├─comment
│  │  ├─favorite
│  │  ├─user
│  │  └─video
│  └─server # grpc启动类
│      ├─comment
│      └─favorite
├─log # 输入的日志信息
│  └─info
└─social-service # 社交模块
    ├─cmd # 启动类
    ├─global # 定义全局变量
    ├─handler # 处理业务
    ├─proto   # proto文件
    │  ├─favorite
    │  ├─message
    │  ├─relation
    │  └─user
    └─util # 封装的工具类

接口文档地址: https://apifox.com/apidoc/shared-09d88f32-0b6c-4157-9d07-a36d32d7a75c/api-50717106

三、测试结果

3.1功能测试

功能项 接口名称 测试点 模块 结果
基础接口 视频流接口 不限制登录状态,返回按投稿时间倒序的视频列表 base-service 测试通过
基础接口 用户注册 新用户注册时提供用户名,密码即可,用户名需要保证唯一。创建成功后返回用户 id 和权限token base-service 测试通过
基础接口 用户登录 通过用户名和密码进行登录,登录成功后返回用户 id 和权限 token base-service 测试通过
基础接口 用户信息 获取用户的 id、昵称,如果实现社交部分的功能,还会返回关注数和粉丝数 base-service 测试通过
基础接口 投稿列表 登录用户选择视频上传 base-service 测试通过
基础接口 发布列表 用户的视频发布列表,直接列出用户所有投稿过的视频 base-service 测试通过
互动接口 赞操作 登录用户对视频的点赞和取消点赞操作 interaction-servic 测试通过
互动接口 喜欢列表 用户的所有点赞视频 interaction-service 测试通过
互动接口 评论操作 登录用户对视频进行评论 interaction-service 测试通过
互动接口 评论列表 查看视频的所有评论,按发布时间倒序 interaction-service 测试通过
社交接口 关注操作 已登录的用户对其他用户进行关注 social-service 测试通过
社交接口 关注列表 已登录的用户查询其他用户的关注列表 social-service 测试通过
社交接口 粉丝列表 已登录的用户查询用户的粉丝列表 social-service 测试通过
社交接口 好友列表 已登录的用户查询好友列表 social-service 测试通过
社交接口 发送消息 已登录的用户给其他用户发送消息 social-service 测试通过
社交接口 聊天记录 已登录的用户查询与其他用户的聊天记录 social-service 测试通过

用户测试样例

用户鉴权失败样例


3.2性能测试

  1. 我们使用pprof进行性能监测,因为每次请求grpc都会产生连接和销毁连接造成服务的性能消耗,思考后我把grpc的连接设置成一个全局变量,后来发现这个全局变量有一个问题,在并发情况下,用同一个全局变量会导致读写错误。
  2. 经过思考,我设置了互斥锁的全局变量,但是性能提升不是很明显。
  3. 经过搜索引擎查询资料,最后利用线程池技术,简单工厂设计模式设计出了一个GrpcFactory工厂,每次只需要调用工厂就可以返回连接配合利用grpc的keep-alive使得grpc的连接开销变小。性能测试图如下:

    优化前

    在这里插入图片描述

优化后

在这里插入图片描述

四、项目总结与反思

4.1目前存在的问题

  1. 聊天记录存储到mysql中可能导致查询聊天记录mysql压力过大
  2. 敏感词过滤要耗费大量内存。

    4.2已经识别的优化项

  3. 判断user和video是否存在的时候,可以直接从redis中判断增加速度
  4. 应该将聊天记录缓存到redis中{token:create_time}的形式,因为前端需要不断获取到最晚消息的发布时间
  5. 上传视频进行异步发送,减少用户等待时间优化用户体验。
  6. 因为迭代次数过多,代码冗余过多,代码内容不清晰,应该进行适当的封装和复用。

    4.3架构演进的可能性

  7. 分库分表
  8. 做到数据库的读写分离
  9. 我们会在第七届青训营使用Hertz和Kitex重构代码
  10. 使用Minio做对象存储而不是使用七牛云
  11. 准备用机器学习训练模型加快强感词的过滤效果和速度而不是使用普通算法

    4.4项目中的反思和总结

  • 代码应该尽可能优雅的写法,让以后的改动是方便的,应该满足开放封闭原则。
  • 一个优秀的程序员应该让别的程序员更好的工作,我的队友给我提供了很多的工具,让我工作更加高效。
  • 测试是一个项目的重点,没有测试的软件是不合格的,而测试的关键则是边界点的问题。
  • 每一个同步的位置都是并发情况下容易发生错误的地方,都要加上互斥锁。
  • 一个项目应该敢为极致,在自己力所能及的地方做到最好,应该尝试多种可能性,寻找最好的解决办法!

五、部署

  1. 安装ffmpeg环境
  2. 改变每个模块中global的mysql连接和redis连接
  3. 改变base-service下的video中的七牛云密匙和仓库名称
  4. Linux下执行命令./run.sh

六、演示视频

【消失的token作品视频】https://www.bilibili.com/video/BV1634y1T71p?vd_source=04ce138fbcd8dc0d65299e3dccf2b3f1


后续迭代

数据库索引的建立

  1. 用户登录接口索引设置
    用户登录接口,要验证用户名和密码的正确性,所以我们给user表的name和password字段加上了联合索引,避免了回表查询。
  2. 视频流接口索引设置
    视频流接口需要查询晚于某一个时间的视频,所以我们在视频的发布时间需要创建索引,同时考虑到了索引失效的问题,对已经有的sql进行优化。
  3. 关注列表索引设计
    我们的关注表是attention,其中字段只有user_id和touser_id,我们在获取关注列表的时候需要对这两个字段进行查询。
  4. 用户的喜欢列表索引
    用户喜欢的列表需要查询favorites表,我们在user_id,video_id创建了idx_favorites_user_video联合索引。
  5. 软删除评论的索引
  • 我们一开始设置软删除的时候是bool类型,但是这样使得索引效率不高,因为字段只有true和false,区分度低。
  • 最后我们设置一个删除的时间,提高了区分度,使得idx_delete_comment索引使用更高效。
  1. 查询评论的索引
    查询评论是根据视频的id查询的,我们在comments表的video_id创建了idx_select_comment_list 索引。

    字典树算法实现敏感词过滤

    在第七届,我们会使用机器学习训练模型来处理敏感词。
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
3月前
|
人工智能 搜索推荐 安全
从零到一:微信机器人开发的实战心得
从零到一:微信机器人开发的实战心得
214 2
|
消息中间件 架构师 算法
好家伙!全网开源对标P5~P7程序员技术成长路线,阿里这次是真卷
今年的程序员可以说是最焦虑的一个群体了,面试找工作投简历没人理,有面试机会也面试不过,面试进去还干不长...于是,程序员们纷纷直呼:互联网寒冬又双叒叕来了,环境不好努力也没用躺平算了。
273 1
好家伙!全网开源对标P5~P7程序员技术成长路线,阿里这次是真卷
|
机器学习/深度学习 前端开发 搜索推荐
2023大淘宝技术工程师推荐书单
今天是4月23日了,是联合国教科文组织规定的“世界读书日”。 大淘宝技术的工程师们精心挑选出7本技术类书籍, 有机器学习方面的、推荐系统方面的,分布式领域的,等等。每一位工程师都根据自己真实的阅读心得写了推荐语,希望能帮大家更快挑选到对自己有用的书籍。
217 0
|
缓存 移动开发 算法
2020年Android开发最新整理阿里巴巴、字节跳动、小米面经,你不看看吗?
前言 2020年是转折的一年,上半年疫情原因,很多学android开发的小伙伴失业了,虽找到了一份工作,但高不成低不就,下半年金九银十有想法更换一份工作,很多需要大厂面试经验和大厂面试真题的小伙伴,想提前准备刷下题。接下来分享一份我的字节跳动、阿里巴巴、百度、小米等大厂面试经验和总结。(文末附真题解析大全)
2020年Android开发最新整理阿里巴巴、字节跳动、小米面经,你不看看吗?
|
Linux Windows
直播一对一源码快速搭建的终极秘诀,技术分享
初创公司如果打算自建视频直播平台,其实技术研发成本比较高,由于目前直播技术相对都比较成熟,设备也都支持硬编码,建议可以自主购买一整套的程序源码,把程序架构搭好,然后再进行程序的二次开发。直播一对一源码作为直播平台坚实的技术支持更成为打开新营销时代的钥匙.直播平台几乎每隔几天也会有新的直播APP上架更新迭代。
直播一对一源码快速搭建的终极秘诀,技术分享
|
测试技术 BI
多图对比在腾讯、阿里、字节跳动的工作区别?
互联网人爱相互跳槽,腾讯和阿里一直相互流动,近两年势头强劲的字节跳动也成为跳槽热门去向,那么在这三家公司工作有什么区别呢?一起来看—— 旗舰产品 擅长领域 腾讯:是社交领域的霸主; 阿里:是电商界的巨头; 字节跳动:是内容领域的王者。
1576 0
|
人工智能 算法 开发工具
阿里工程师开发弹幕新玩法,网友不淡定了……
如果你在追剧时喜欢看弹幕、发弹幕,那你一定知道有些剧里弹幕甚至比剧情还要精彩,比如上过热搜的出自《东宫》的那一句“谈恋爱吗?灭你全族的那种”。正是由于这些神一般的网友频频曝出精句,让某些剧集精彩程度翻了几倍,甚至有大量网友来追剧是被弹幕吸引来的。今天,阿里文娱高级开发工程师 神灭介绍一种弹幕新玩法,让弹幕的可玩性更高。
490 0
阿里工程师开发弹幕新玩法,网友不淡定了……
|
前端开发
真香!阿里工程师的一段代码让我看饿了
阿里妹导读:打开盒马app,相信你跟阿里妹一样,很难抵抗各种美味的诱惑。颜值即正义,盒马的图片视频技术逼真地还原了食物细节,并在短短数秒内呈现出食物的最佳效果。今天,我们请来阿里高级无线开发工程师莱宁,解密盒马app里那些“美味”视频是如何生产的。
7001 0
|
关系型数据库 Java Linux
短视频APP开发,前辈告诫我一定要选择开源源码
开放源代码(开源源码)指的是该源码的软件著作权所有者将其所持有的原始码公开,允许大众使用、修改发行的软件或设计体。
|
程序员 Android开发 开发者
免费下载!业界首部安卓热修复宝典出炉,阿里技术大牛联袂推荐
业界首部全方位完整介绍热修复原理书籍《深入理解Android热修复技术原理》,该书为阿里巴巴手淘技术团队撰写,现已免费开放下载。
48047 0