微信朋友圈技术实现设想

前提

微信朋友圈是我们每天都在用的功能, 但是如果让你来实现一个微信朋友圈, 你会如何做呢? 我来简单设想一下.

实现功能

  1. 发朋友圈
  2. 评论动态
  3. 查看朋友圈(只能查看好友的)
  4. 查看评论(只能查看共同好友的)

是不是看着很简单? 也没有几个功能嘛. so easy.

开始实现

数据库选用了MySQL, 熟悉的关系型数据库

版本一

看了只有两条内容, 朋友圈动态, 朋友圈评论, 直接设计数据库.

1457859-20200301144620252-775785387.png (1534×574)

简单吧. 好, 按照这个数据模型, 当实现时, 就会发现问题.

1.如何获取好友圈数据

如果简单的拉取好友列表, 然后拉取出其中好友的动态, 不好意思, 你的接口慢到爆炸, 毕竟用户基数就在那.

2.如何获取动态下的共同好友评论

当然, 评论也可以获取动态下的所有评论, 然后过滤掉非好友的评论, 同上, 太慢了.

想想哈

如何解决这个问题? 上面获取数据慢主要是因为要做数据的筛选, 那如果我能够直接拿到最终数据, 不就可以解决这个问题了么?

版本二

为了能够直接获取到朋友圈的数据, 在现有基础上是肯定不行的, 根据获取数据的思路, 直接获取朋友圈数据, 当然要加一张朋友圈的表了.

新增一张朋友圈表:

1457859-20200301144649062-1235630430.png (1010×572)

这样就很方便了, 用户查看朋友圈时, 可以直接定位查看的动态以及可以查看的评论, 在根据动态ID和评论ID将内容补充进去就行了.

但是相应的, 就需要维护用户朋友圈这样的一张表, 在用户发帖删帖加好友删好友发评论删评论的时候, 去做数据的同步操作, 而且要异步的进行, 毕竟同步的话, 接口响应就会变慢. 但是我觉得, 这样的代价是值得的, 可以换来拉取数据接口的快速响应.

你以为到这就完了么? 天真. 看下图:

1457859-20200301144733770-1375060371.png (1076×1096)

这样的消息在朋友圈都看到过吧. 它应该是所有用户都可以看到的, 可以将它理解为官方发的动态. 如果按照我们现在的设计, 就要将它插到所有用户的朋友圈中, 也就是说, 如果官方发一条动态, 有一百万用户的话, 就要插一百万条同样的数据, 而且有新注册用户, 还要将历史数据插进去. 这样不只难以维护, 而且有太多无用数据了.

想想哈

这种数据最好只需要插入一条, 所有用户都去读就好. 最直观的方法, 在朋友圈表中, 指定一个用户ID(比如0), 是所有用户共同的数据, 这样就解决了

但是, 之前我们的评论是直接保存到朋友圈中的, 可以这样保存, 是因为每个用户在朋友圈表中的每个动态是唯一的, 但是现在如果插入公共ID, 就不能这么存了, 哪又该如何处理动态的评论呢? 难道回到开始的动态查询吗?

既然有用户的朋友圈动态表, 那就可以有朋友圈评论表, 朋友圈动态中保存的是用户可以查看的动态, 那么朋友圈评论表保存的就是用户可以查看的评论.

版本三

修改用户朋友圈表结构如下:

1457859-20200301144757359-174076412.jpg (1098×1032)

这样改动之后, 维护的数据和版本二基本一样, 而且也解决了版本二的问题.

来看看现在的相关操作

查看朋友圈

  1. 朋友圈动态查找可以查看的动态(包含用户ID和公共ID)
  2. 朋友圈评论查看相关评论(包含用户ID和公共ID)
  3. 动态表和评论表根据ID将相关数据取出

前两步走索引, 第三步直接根据主键获取, 而且拿出来的没有无用数据

数据维护的操作(一下所有操作官方特判)

发动态

  1. 查找用户所有好友
  2. 将动态添加到所有好友的朋友圈动态表中(包括用户自己)

删动态

  1. 查找用户的所有好友
  2. 将动态从好友的朋友圈动态表中删除
  3. 将动态从好友的朋友圈评论表中删除

发评论

  1. 查找用户的所有好友A
  2. 朋友圈动态中找出A可以查看此动态的好友B
  3. 若评论是回复某用户, 则从B中过滤不是回复用户好友的用户, 得到C
  4. 将数据添加到C朋友圈评论表中

删评论

  1. 查找用户的所有好友A
  2. 朋友圈评论中找出A中可以查看此评论的用户B
  3. 删除B朋友圈评论数据

添加好友

  1. 找到好友的所有动态, 添加到用户的朋友圈动态
  2. 找到好友在用户朋友圈动态中所有动态下的相关评论(包括评论和被评论), 并从中过滤掉用户不可查看的评论, 同步好友圈评论

删除好友

  1. 找到好友在用户朋友圈动态中所有动态下的相关评论, 删除用户好友圈评论数据
  2. 找到好友的所有动态, 从用户的朋友圈动态中删除

以上, 基本就是我目前的设想


总结

可以看到, 最终的版本, 基本所有的逻辑都在异步数据的同步上, 业务逻辑基本很少, 这样可以保证拉取数据的接口快速响应, 但因为是异步操作, 难免会造成数据的延迟. 比如说: 当处理数据过大时, 用户发了动态, 但是还没有做异步的处理, 他的好友时看不到他刚刚发表的动态的.

以及可能存在的其他暂时没有发现的问题. 先这样, 没有更好的想法了.

以上!!!

订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请发表评论。x