群发私信功能怎么制作?

我司的场景:
A关注了B,当B发帖子、评论帖子都要给A发一封相关内容的私信,例如:“B发布了xxxx”,“B评论了xxxx”

方案一:
B每产生一条动态发一封私信。

问题:如果B有100万粉丝,每产生一条动态,就要发100万封私信,这肯定行不通。

方案二
B产生一条动态,将该条动态存入群发信息表(存一条数据),当A打开页面进行浏览时,再从群发信息表拉取B的动态放到私信表里,再从私信表中按时间顺序拉取私信列表。

问题:如果B短时间发了很多条信息,再加上A关注的其他用户C,D,E,D......也发了很多条信息,那么A从群发信息表中单次拉取的数据条数过多,肯定会造成接口响应过慢。

这个功能应该如何制作?

阅读 2.5k
4 个回答

方案一肯定是不行的
方案二看似可以的,但是题主自己觉得有问题,问题在于A关注的用户太多,所以A拉取的数据多...

但...如果我们随便看看咱们常用社交app的做法,加上针对一次数据过多的常用处理来说,两相结合一想,那方案也就出来了

一次数据过多常用处理,那就是分页嘛,所以首先对于A打开页面进行浏览时,拉取的数据肯定是要分页的。分页就可以保证一次性不会拉取较多的数据了

其次,如果光有分页可能还不行,考虑到社交属性,比如A关注的B,C,D,E,D,但B一天发100条动态,就算分页的话,那A打开页面,翻几次页都是B的动态肯定也是不行啦,所以这个时候肯定就必须要做关注人的动态分组

比如微博APP做法就是,你刷关注人动态时,基本是看到B的两条或三条动态,下面有个折叠按钮:查看该博主其他动态,点击就会再弹出几个该博主的动态,这是一种分组方式

再比如知乎APP,知乎那就很明显啦,知乎分组就在关注人页面的最上方,按照你关注的人显示的最经常访问

如果不分组,应该分页也就够了...不过我之前也是没做过类似需求哈,只是根据自己观察到的提的方案,抛砖引玉,期待做过的大佬再来分享,就酱!

可以根据用户的不同状态进行分压 在线的用户可以分批次推送,不在线的就主动拉 显示最新的几条数据就行

我的粗浅认识,多数系统会采用方案一的。

对于一个二线网站,每天推送数十亿的消息,也是正常的,正是靠这数十亿的消息,维系用户的活跃度。
问题在于如何处理,让看似『肯定行不通』的方案可行。

有几点,一是这些消息是有时限的,二是分发到个人消息队列,而不是入关系型数据库,三是适当合并,同类型的消息不会连续发很多消息,而是累积一个总数。

我觉得方案一也没什么不可行,本来就有这么多消息需要推送。问题是如何推送这么多消息,MQ分区,分通道,分类型,但每个客户一个通道我觉得也不太现实,分下来之后,就能到达可接受的范围了。当然,一模一样的需求我也没做过,只是一些思考而已。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题