【go】类似豆瓣这样的网站通知系统如何设计?

类似豆瓣这样场景比较复杂网站通知系统如何实现?
关注的用户发布的日志,相册,说说,小组话题都需要提醒.
自己的日志,小组话题,照片等被赞需要提醒.
加入的小组发布了新话题,自己的话题有了新回复需要提醒.
自己的相册,日志有了新评论需要提醒
用户加入小组申请,来自别的用户的好友申请需要提醒.

所有提醒都希望在网站页面header中分类显示
类似微博这样:
【go】类似豆瓣这样的网站通知系统如何设计?

这样复杂的通知系统如何设计呢?
哪位大大可以给一个设计思路,最好附带数据库表设计!感激不尽!
ps: 通知不需要实时推送,刷新页面后显示

回答

一种思路是可以使用ajax轮询,隔一段时间自动向后台发送请求获取数据,还有一种思路是建立长连接,例如websocket。看你的需求以及需要实现的复杂程度了。

数据建模 - 数据就是数据

首先,我没看过豆瓣的原代码,所以不知道它是怎么实现的。
从关系数据库设计的角度出发,数据库用来保存数据,记录事实,与“应用”(数据的使用)无关。所以,在设计数据库时,重点在数据本身。

例子 - 微博提醒的简单实现

根据你的需求,我可以给出一种实现方式。
举个简单的例子:用户发微博,关注该用户的人收到提醒。
需要保存的数据(需要记录的事实):用户,微博,关注,未读的微博

User (UserName, email, ...)
MicroBlog (UserName FK, PostTime, Content, ...)
UserFollower (UserName FK1, Follower FK2)
UnreadMicroBlog (UserName, Author FK, PostTime FK)

每个User发布0-n个MicroBlog
每个User关注0-n个User,每个User被0-n个User关注 (UserFollower实现多对多关系)
每个User有0-n个UnreadMicroBlog未阅读

在UnreadMicroBlog 中,Author 和 PostTime 为外键,引用MicroBlog。加粗字体表示主键。

解释 - 应用程序和数据库的交互过程

当一个User发布了一条微博,向MicroBlog插入一条记录,向UnreadMicroBlog插入多条记录,每个该用户的关注者(记录在UserFollower中)对应一条记录。
这样,应用程序可以从UnreadMicroBlog中获取当前用户有哪些未读微博。当用户处理了一条未读微博,从UnreadMicroBlog中delete对应的记录。

当然,实际的系统比这个例子复杂得多,需要记录的数据也更多更复杂,但是只要按照正确的方法进行建模,就能设计出合理的数据库和整个应用。

我也思考过这个问题,目前的表结构式:
1、消息聚合表
2、分类消息表1
3、分类消息表2
4、分类消息表3

每当系统有消息发送时,先创建对应的消息表n记录,然后后台触发聚合表对相应的一类消息进行查询、更新过添加,比如更新某类的聚合总数,最终消息聚合表标题就是显示给用户的消息标题,用户也只需要查询聚合表就可以了,如:

X(共5条):你的申请已被通过(显示X单位给你发的最近一条消息);
Z(共2条):你的评论被a、b、d等8人点过了赞

以上消息点击进去后,就是该类的所有消息列表了

以上是 【go】类似豆瓣这样的网站通知系统如何设计? 的全部内容, 来源链接: utcz.com/a/100359.html

回到顶部