腾讯微信产品经理面试题
其中第二题是一道偏技术的问题,出现在产品经理的面试中确实
有点意外,但这题不失为一道很好的产品设计与系统分析的题目。
系统分析也是我们“产品经理学技术”系列文章规划中的一个部分,
也是将我们所讲的技术进行“升腾讯微信产品经理面试题
其中第二题是一道偏技术的问题,出现在产品经理的面试中确实
有点意外,但这题不失为一道很好的产品设计与系统分析的题目。
系统分析也是我们“产品经理学技术”系列文章规划中的一个部分,
也是将我们所讲的技术进行“升华”的一部分内容。
下面我们尝试回答一下这个问题,算是抛砖引玉了,大家有好的
答案也可以给我们留言进行讨论。
朋友圈的基本数据结构设计是怎样的?既能做到完美阅读权限设
置,又能兼顾性能?
关于消息的基础数据,比如文字、图片、时间、位置等这些咱就
不表了。这些数据基本上与权限和性能没有多大关系,可以理解为
单独存储,纯技术活。这里只讨论权限与性能相关的数据结构。
而在权限管理上,微信采用了给用户打“标签”来进行分组,这
个标签的分组与微信通讯录一致。在数据上,就是给每个关系增加
一个“标签”标记。这里需要注意的是,虽然微信的关系在产品使
用上给用户是双向的(即互相关注),但是在存储的时候,是给互相
关的两个用户分别建立了关系数据,也就是每个人独有自己的一份
“通讯录”。这通过删除了自己的好友之后,自己并不从别人的通
讯录删除就可以看得出来。标签分组的基础数据就是这样了,这也
是后面朋友圈权限管理的基础。
对于个人朋友圈timeline所能看到的消息,按照一般的逻辑是
先获取所有朋友的消息,然后剔除掉没有授权给自己看的消息、剔
除掉自己屏蔽的用户消息,然后才得到自己当前看到的timeline。
如果是这样的逻辑的话,等于每次刷新朋友圈,都要跑到所有的消
息池里面去找到上述通讯录中朋友们的消息,还要对找到的每条消
息去判断用户是否有权限阅读。这显然是效率低下的方式,更何况
微信是这么大的一个访问量和数据量。所以,这种数据结构设计是
行不通的了。一般逻辑下朋友圈每次读取的过程
解决这种性能问题一般的思路就是把需要大计算量的过程分散到
平时零散的时间去做。在这里的思路就是:平时就把每个用户需要
的timeline数据按照权限设置准备好,等到用的时候(刷新朋友圈)
就直接读取准备好的内容。那么答案就出来了:除了存储一份上面
讲到的文字,图片等基本信息外,还需要给每个用户存储一份
timeline数据,注意,是每个用户一份。当然,这里的“每份”不
需要存储完整信息,只需要存储消息的ID和时间(可能需要)。每个
人刷新自己的朋友圈时,读取自己的那份数据就行了,既不用去消
息池子里面筛选,也不用判断用户权限。
那是怎么实现权限控制呢?
当一个用户发布一条消息时会按照上面讲的标签设置相关的权限,
服务器就会给每个有权限接收这条消息的用户的timeline中写入这
条消息。也就是在用户发布的这一刻,就做好了权限安排,而不是
等到读取的时候。这样就自然减少了读取的时候的计算量,提高了
效率。
发布时进行权限控制(示意图,实际比这复杂)
至于分库分表这些就不展开了,知道有这么回事就行。有时候这
种技术上的设计也是会限制产品的
腾讯微信产品经理面试题 来自淘豆网m.daumloan.com转载请标明出处.