需要帮助设置 Facebook 通知系统样式背后的逻辑



我想为我的网站建立一个通知系统,类似于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 分钟的事件?

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

谢谢

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

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

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

我构建了一个名为 notifications 的类,在这个类中,有一些函数可以为我想要通知的每个事件添加通知,例如: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
    为此,我
  • 为我创建的每个新通知添加了显示字段原因,我检查数据库是否是同一用户,是否有另一个未看到的通知,来自同一生成用户。如果此条件为 true,我将旧通知设置为显示 = false,并将两个新通知分组,结果如下:用户 X 在他的图库中添加了 X 张新照片。
  • clicked_on字段存储单击项目的日期,以便我可以根据需要根据此信息生成报告。显示内容时,如果此项不为空,我会突出显示通知以标记尚未选中的内容。
  • 我创建了一个文本字段来将通知内容存储在json中,导致不同的通知具有不同的样式来呈现给用户。例如,新的评论通知只有文本,但新的照片通知具有预览拇指。

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

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

我也一直在研究这样的东西,我刚刚在堆栈溢出上发现了这个问题

构建通知系统

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

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

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

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

最新更新