1

我想为我的网站建立一个通知系统,类似于 Facebook。通知不需要是实时的。

这就是我的想法:

  1. 用户创建事件(上传新照片,添加新评论,如照片,甚至向所有用户发出管理警报)

  2. 每 5 分钟运行一次 cronjob 以将通知添加到通知表中:id|id_content|type_of_content_enum|affected_user_id|date|seen_bool

  3. cronjob 将为每种类型的通知运行几个函数,例如:

    add_photos_notification()// 该函数将检查过去 5 分钟内添加的所有照片,并在通知表中为每个关注此人的用户插入一行。该功能会将过去 5 分钟内添加的所有照片分组,因此关注者不会收到很多相同类型内容的通知。导致如下通知:用户 X 在他的个人资料中添加了 Y 张照片。

    add_admin_notification()// 这个函数会检查网站管理在过去 5 分钟内添加的所有新闻,并在通知表中插入一行,为系统上的每个用户...

这是构建通知系统的正确方法吗?

是否有可能错过一个事件,每 5 分钟运行一次 cron,函数检索过去 5 分钟的事件?

为了安全起见,您是否认为另一种方法可以检查所有“通知”字段不正确的事件?将获取 'notified' = false 的事件的相同函数,在将该通知添加到通知表后将其更新为 true。

谢谢,

4

2 回答 2

3

我选择了 cronjob 路线,到目前为止工作良好。由于我们的系统需要通知这么多用户,我发现这是最合适的方式,原因有两个。

  1. 我不需要编辑我当前的脚本代码,插入函数来为我想要通知的每个事件添加通知。

  2. 由于某些操作会影响到许多用户,因此实时添加通知可能会导致脚本长时间延迟和超时。

我建立了一个名为通知的类,在这个类中,有一些函数可以为我想要通知的每个事件添加通知,例如: user_added_a_new_photo(); user_commented_on_a_photo();

对于每个通知生成,我会为每个用户添加 1 个条目以得到通知。这就是我的通知数据库的样子:

id
affected_user_id //user being notified
user_generating_the_notification_id
content_type // enum containing all type of notifications my system has (example: photo, video, comment) ...
content_json // a json containing the notification content. Based on the content type, on the display view file, I call helpers that will format the notification row using the json info.
date // the date the notification was added
seen_on // the date the user saw the notification
clicked_on // if user clicked on the notification, store the date he clicked on it
display // true or false
  • 为此,我为我创建的每个新通知添加了显示字段原因,我检查数据库是否同一个用户,是否有来自同一个生成用户的另一个未见过的通知。如果此条件为真,我将旧通知设置为 display = false,并将两个新通知分组,结果如下:用户 X 在他的图库中添加了 X 张新照片。
  • clicked_on 字段存储项目被点击的日期,因此如果需要,我可以根据此信息生成报告。显示内容时,如果此项不为空,我会突出显示通知以标记尚未选中的那些。
  • 我创建了一个文本字段来将通知内容存储在 json 中,因为不同的通知有不同的样式来呈现给用户。例如,一个新的评论通知,只有文本,但一个新的照片通知,有一个预览拇指。

到目前为止,运行它并满足我的需求没有问题。

唯一的缺点是,由于 cronjobs 只能每 1 分钟运行一次,因此通知可能会延迟 1 分钟。但由于我不需要实时,我将 cronjob 设置为每 5 分钟运行一次。

于 2013-09-24T14:19:39.053 回答
0

我也一直在研究类似的事情,我刚刚在stackoverflow上发现了这个问题

构建通知系统

看看答案,用户确实对如何实现这种系统的理论有所了解。

据我所知,您需要为每个通知创建记录或对象,如果有 100 人订阅该事件,则将生成 100 条记录。加载页面时,您的系统将找到与登录用户相对应的所有通知(可能通过记录 ID),然后您会通知用户他们有多少通知。

现在这样做的另一种方法(注意我没有实现任何这些,它们只是想法)是在 aa 表中发出通知,然后我们将有第二个表来保存用户 ID 和通知 ID ,当用户订阅通知时,将被添加到此表中,例如,确认好友请求。

请再次注意,这些不是经过验证的方法,它们是我对此事的一些研究的结果,我在做任何事情之前都会阅读我给你的帖子。

于 2013-09-20T09:54:58.440 回答