本项目采用分布式的思想,使用gozero框架,将项目拆分成,user、content、media、chat等服务。每个服务内部又拆分为http服务和rpc服务,http对外暴露接口,对数据库等操作放在rpc服务中由http服务调用。
链路追踪
由于各种服务采用分布式部署,本项目采用kafka集群实现服务链路追踪和日志上报的功能,每个服务对应自己的topic,对报错信息,运行位置实时进行上报(api->rpc->model)。
redis缓存
本项目大量采用redis缓存,一方面gozero框架在查询数据库时主动支持了缓存功能;另一方面,我们针对点赞,关注,观看数等高频次变动的数据,又手动封装了一层redis缓存,采用hash的方式,将这些计数的数据存放在redis中,在采用time.NewTicker设置定时任务,定期将redis中的数据回写到数据库中。
- 针对我个人的关注任务,如果短时间内有大量关注请求,我采用令牌桶限流的方式,1s内支持10个并发请求,令牌够的时候就直接走数据库,令牌不够就开一个协程,随机10min内时间后,执行写入数据库操作,如果写入失败了,则再等待一个周期进行写入,直到写入成功。
- 在获取关注数和粉丝数和好友数的时候,采用redis缓存,由于这里对数据的一致性要求不高,因此把重心放在性能上,获取关注数或粉丝数或好友数时,先去redis里查,没有的话再走数据库的count操作,并同时赋值在redis当中,设置过期时间为一小时,这样一方面减轻redis压力(点赞操作要大量存数据到redis),另一方面保证数据不一致的最长时间为1小时。