Hertz开发后端应用2| 青训营笔记

160 阅读2分钟

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

以大项目doushen的代码为例,看一下并发的代码如何写。

在doushen这个大项目中,有些接口在未命中缓存的时候,需要向各个微服务请求获取最新得数据。我们以feed为例,具体理一下feed的和各微服务的调用关系。

image.png

从图中,我们可以看到,在缓存未命中后,feed会去GetFeed来做最新数据请求,此方法内部首先去通过GetVideoFeedMethod获取最新的feed,然后再根据查到的video切片去向各个微服务发起并发请求。 这里的并发请求分为了两大类,一类是GetUserLatestMap,用于获取最新的用户信息,比如发布作品数,关注关系,喜欢和被喜欢的数量等,另一类是GetVideoLatestMap,用于获取最新的视频数据,比如视频被点赞的数量,视频的评论数,当前用户与视频的喜欢关系。

image.png

GetFeed如上图,首先去GetVideoFeedMethod获取视频流切片,这个请求是直接调用的video微服务。随后,并发的去调用两个并发请求,GetUserLatestMapGetVideoLatestMap。本项目中的并发均使用了sync.WaitGroup来实现,即当并发的请求均结束后,退出并发逻辑。如下图,在wg计数器归0后,等待结束,开始拼接数据。

image.png

数据和错误在上篇文章均已经介绍过,均是通过长度为1的chan来进行回传。

GetUserLatestMapGetVideoLatestMap中,嵌套实现了同样的一套并发逻辑,以GetUserLatestMap为例,内部并发的向后端微服务去获取最新数据。

image.png

例如GetUserMap,调用了user微服务提供的通过切片查询用户的接口。该接口返回的也是切片且与传入id无严格对应关系,故这里对其转为map。(这个逻辑其实应该交给微服务处理,后续的relation和favorite均是如此实现的)

image.png

本回完,thanks。