b站别人给我私信了在哪看(B)

首页教程更新时间:2023-01-30 16:55:47

作 者: JavaGuide

原文链接:https://mp.weixin.qq.com/s/F6yoO7yw2jU3hFhzE58JCQ

使用过简书,知乎或 b 站的小伙伴应该都有这样的使用体验:当有其他用户关注我们或者私信我们的行为时,我们会收到相关的消息。 虽然这些功能看上去简单,但其背后的设计是非常复杂的,几乎是一个完成的系统,可以称之为 站内消息系统

我以 b 站举例(个人认为 b 站的消息系统是我见过的非常完美的,UI 也最为人性化的):

b站别人给我私信了在哪看,B(1)

b站站内消息

可以看到 b 站把消息大致分为了三类:

  1. 系统推送的通知(System Notice);
  2. 回复、@、点赞等用户行为产生的提醒(Remind);
  3. 用户之间的私信(Chat)。

这样设计不仅分类明确,且处于同一个主体的事件提醒还会做一个聚合,极大的提高了用户体验,不让用户收到太多分散的消息。

举个例子:比如你在某个视频或某篇文章下发表了评论,有 100 个人给你的评论点了赞,那么你希望消息页面呈现的是一个一个用户给你点赞的提醒,还是像以下聚合之后的提醒:

b站别人给我私信了在哪看,B(2)

消息的聚合

我相信你大概率会选择后者。

我认为对于很多应用来说,这样的设计都是非常合理的,接下来我写写我对于消息系统的设计。

系统通知(System Notice)

系统通知一般是由后台管理员发出,然后指定某一类(群体,个人等)用户接收。基于此设想,可以把系统通知大致分为两张表:

  1. t_manager_system_notice(管理员系统通知表) :记录管理员发出的通知 ;
  2. t_user_system_notice(用户系统通知表) : 存储用户接受的通知。

t_manager_system_notice 结构如下:

b站别人给我私信了在哪看,B(3)

t_user_system_notice 结构如下:

b站别人给我私信了在哪看,B(4)

当管理员发布一条通知后,将通知插入 t_manager_system_notice 表中,然后系统定时的从 t_manager_system_notice 表中拉取通知,然后根据通知的 type 将通知插入 t_user_system_notice 表中。

如果通知的 type 是 single 的,那就只需要插入一条记录到 t_user_system_notice 中。如果是全体用户,那么就需要将一个通知批量根据不同的用户 ID 插入到 t_user_system_notice 中,这个数据量就需要根据平台的用户量来计算。

举个例子: 管理员 A 发布了一个活动的通知,他需要将这个通知发布给全体用户,当拉取时间到来时,系统会将这一条通知取出。随后系统到用户表中查询选取所有用户的 ID,然后将这一条通知的信息根据所有用户的 ID,批量插入 t_user_system_notice 中。用户需要查看系统通知时,从 t_user_system_notice 表中查询就行了。

注意:

  1. 因为一次拉取的数据量可能很大,所以两次拉取的时间间隔可以设置的长一些。
  2. 拉取 t_manager_system_notice 表中的通知时,需要判断 state,如果已经拉取过,就不需要重复拉取, 否则会造成重复消费。
  3. 当一条通知需要发布给全体用户时,我们应该考虑到用户的活跃度。因为如果有些用户长期不活跃, 我们还将通知推送给他(她),这显然会造成空间的浪费。 所以在选取用户 ID 时,我们可以将用户上次 登录的时间与推送时间做一个比较,如果用户一年未登陆或几个月未登录,我们就不选取其 ID,进而避免 无谓的推送。
  4. 有的小伙伴可能有疑问: 某条通知已经被拉取过的话,在其后注册的用户是不是不能再接收到这条通知? 是的。但如果你想将已拉取过的通知推送给那些后注册的用户,也不是特别大的问题。 只需要再写一个定时任务,这个定时任务可以将通知的 push_time 与用户的注册时间比较一下,重新推送即可。

以上就是系统通知的设计了,接下来再看看较难的提醒类型的消息。

事件提醒(EventRemind)

之所以称提醒类型的消息为事件提醒,是因为此类消息均是通过用户的行为产生的,如下:

诸如此类事件,我们以单词 action 形容不同的事件(点赞,回复,at)。 可以看到除了事件之外,我们还需要了解用户是在哪个地方产生的事件,以便当我们收到提醒时, 点击这条消息就可以去到事件现场,从而增强用户体验,我以事件源 source 来形容事件发生的地方。

由此可以设计出事件提醒表 t_event_remind,其结构如下:

b站别人给我私信了在哪看,B(5)

消息聚合

消息聚合只适用于事件提醒,以聚合之后的点赞消息来说:

聚合之后的消息明显有两个特征,即:action 和 source type,这是系统消息和私信都不具备的, 所以我个人认为事件提醒的设计要稍微比系统消息和私信复杂。

如何聚合?

稍稍观察下聚合的消息就可以发现:某一类的聚合消息之间是按照 source type 和 source id 来分组的, 因此我们可以得出以下为 SQL:

SELECT*FROMt_event_remindWHERErecipient_id=用户ID ANDaction=点赞ANDstate=FALSEGROUPBYsource_id,source_type;

当然,SQL 层面的结果集处理还是很麻烦的,所以我的想法先把用户所有的点赞消息先查出来, 然后在程序里面进行分组,这样会简单不少。

拓展

其实还有一种设计提醒表的做法,即按业务分类,不同的提醒存入不同的表,这样可以分为:

  1. 点赞提醒表
  2. 回复提醒表
  3. at(@)提醒表。

我认为这种设计比第一种的更松耦合,不必所有类型的提醒都挤在一张表里,但是这也会带来表数量的膨胀。 所以各位小伙伴可以自行选择方案。

私信

站内私信一般都是点到点的,且要求是实时的,服务端可以采用 Netty 等高性能网络通信框架完成请求。 我们还是以 b 站为例,看看它是怎么设计的:

b站别人给我私信了在哪看,B(6)

站内消息系统的设计

b 站的私信部分可以分为两部分:

  1. 左边的与不同用户的聊天室;
  2. 与当前正在对话的用户的对话框,显示了当前用户与目标用户的所有消息。

按照这个设计,我们可以先设计出聊天室表 t_private_chat,因为是一对一,所以聊天室表会包含对话的两个用户的信息:

b站别人给我私信了在哪看,B(7)

这里 user1_id 和 user2_id 代表两个用户的 ID,并无特定的先后顺序。

接下来是私信表 t_private_message 了,私信自然和所属的聊天室有联系,且考虑到私信可以在记录中删除(删除了只是不显示记录,但是对方会有记录,撤回才是真正的删除),就还需要记录私信的状态,以下是我的设计:

b站别人给我私信了在哪看,B(8)

消息设置

消息设置一般都是针对提醒类型的消息的,且肯定是由用户自己设置的。所以我想到一般有以下设置选项:

  1. 是否开启点赞提醒;
  2. 是否开启回复提醒;
  3. 是否开启@提醒;

下面是 b 站的消息设置:

b站别人给我私信了在哪看,B(9)

消息设置

可以看到 b 站还添加了陌生人选项,也就是说如果给你发送私信的用户不是你关注的用户,那么视之为陌生人私信,就不接受。

以下是我对于消息设置的设计:

字段名类型描述user_idLONG用户 IDlike_messageBOOLEAN是否接收点赞消息reply_messageBOOLEAN是否接收回复消息at_messageBOOLEAN是否接收 at 消息stranger_messageBOOLEAN是否接收陌生人的私信

总结

以上就是我对于整个站内消息系统的大概设计了,我参考了很多文章的内容以及很多网站的设计,但实际项目的需求肯定与我所介绍的有很多出入,所以各位小伙伴可以酌情参考。

,
图文教程
相关文章
热门专题
推荐软件
奇热小说
奇热小说
下载
QQ2019手机版
QQ2019手机版
下载
王者荣耀
王者荣耀
下载
百度浏览器迷你版
百度浏览器迷你版
下载
2345浏览器手机版
2345浏览器手机版
下载
网易邮箱
网易邮箱
下载
爱奇艺
爱奇艺
下载
网易云音乐
网易云音乐
下载
WPSOffice
WPSOffice
下载
优酷
优酷
下载
谷歌浏览器(Chrome)
谷歌浏览器(Chrome)
下载
迅雷看看播放器
迅雷看看播放器
下载
UC浏览器
UC浏览器
下载
QQ音乐
QQ音乐
下载
阿里旺旺买家版v9.12.10C官方版
阿里旺旺买家版v9.12.10C官方版
下载
360安全卫士v12.1官方版
360安全卫士v12.1官方版
下载
猜你喜欢
动漫大联盟
动漫大联盟
下载
投石机海盗激斗
投石机海盗激斗
下载
星环穿越
星环穿越
下载
雅兔出行
雅兔出行
下载
网络猪最新版
网络猪最新版
下载
沪小英语iOS
沪小英语iOS
下载
上古卷轴5重制版六只小精灵MOD
上古卷轴5重制版六只小精灵MOD
下载
僵尸危机手机版
僵尸危机手机版
下载
快记Mac版V2.0.6
快记Mac版V2.0.6
下载
布丁抓娃娃
布丁抓娃娃
下载
TableToppe
TableToppe
下载
紫马财行电脑版
紫马财行电脑版
下载
58二手车电脑版
58二手车电脑版
下载
鹤壁行电脑版
鹤壁行电脑版
下载
橙领直聘iOS
橙领直聘iOS
下载
ICC职业板球2015
ICC职业板球2015
下载