腾讯微信产品经理面试题,你也来答答?

发表于:2015-2-13 13:55

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

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

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号