高质量编程与性能调优实战:分析优化获取评论列表功能中存在的性能问题 | 青训营

68 阅读2分钟

本文尝试对极简抖音服务端大项目的获取评论列表功能的性能进行分析并优化。

01 用户信息获取

性能问题分析

由接口手册可以看到,评论列表中的每条评论除了包含评论内容等信息,还包括了评论用户信息。 image.png

由于本项目采用了微服务架构,根据我们的服务划分,需要向user服务发送请求来获取用户信息。

在原方案中,我们遍历评论列表,并逐一向user服务请求对应的用户信息,再将用户信息与评论内容等信息合并为一条信息,伪代码如下:

resp := [];
for comment in comment_list {
    user := requestUserInfo(comment.user_id);
    node := node{comment.content, user, ...};
    resp.append(node);
}
return resp;

优化方案

假设某视频当前有 n 条评论,则在原方案中,需要 n 次rpc请求。我的优化思路就是尽可能减少rpc请求的次数。为了达成这一目标,需要将请求合并,也即将需要获取信息的用户id打包。这个方案下只需要1次rpc请求即可,伪代码如下:

userid_list := [];
for comment in comment_list {
    userid_list.append(comment.user);
}
user_list := requestUsersInfo(userid_list);

resp := [];
for i, comment in comment_list {
    user := requestUserInfo(comment.user_id);
    node := node{comment.content, user, ...};
    resp.append(node);
}
return resp;

测试

02 评论列表获取

性能问题分析

在原方案中,评论列表需要在MySQL中获取,由于磁盘IO的低速,这个方案在高QPS场景下负担过大,甚至会导致服务无法使用。

优化方案

对于这个问题,使用Redis缓存是十分常见的优化手段。我们可以使用一个有序集合将评论按时间先后顺序存储在Redis中。

由于评论列表对于实时性、准确性的要求并不高,因此可以通过轻微牺牲Redis与MySQL的一致性问题来获取更高的性能。

测试