我想为我的网站建立一个通知系统,类似于Facebook。通知不需要实时。
这就是我的想法:
-
用户创建事件(上传新照片、添加新评论(如照片),甚至是向所有用户发送管理警报)
-
每 5 分钟运行一次 cronjob 以将通知添加到通知表中:
id|id_content|type_of_content_enum|affected_user_id|date|seen_bool
-
cronjob 将为每种类型的通知运行多个函数,例如:
add_photos_notification()
//此功能将检查过去 5 分钟内添加的所有照片,并在通知表中为关注此人的每个用户插入一行。该功能将对过去 5 分钟内添加的所有照片进行分组,因此关注者不会收到相同类型内容的太多通知。生成如下通知:用户 X 在其个人资料中添加了 Y 照片。add_admin_notification()
//此功能将检查过去 5 分钟内网站管理部门添加的所有新闻,并在通知表中为系统上的每个用户插入一行......
这是构建通知系统的正确方法吗?
是否有可能错过一个事件,每 5 分钟运行一次 cron,其中函数检索过去 5 分钟的事件?
为了安全起见,您是否认为另一种方法是检查字段"通知"不正确的所有事件?将获取"通知"= false 的事件的相同函数,在将该通知添加到通知表中后将其更新为 true。
谢谢
我选择了cronjob路线,到目前为止工作得很好。由于我们的系统有这么多用户需要通知,我发现这是最合适的方法,原因有两个。
- 我
不需要编辑我当前的脚本代码,插入函数来为我想要通知的每个事件添加通知。
由于某些操作会受到影响,因此实时添加通知可能会导致脚本延迟和超时时间过长。
我构建了一个名为 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,当用户订阅通知时,用户将被添加到此表中, 例如,确认好友请求。
请再次注意,这些不是经过验证的方法,它们是我对此事的一些研究的结果,我在做任何事情之前都阅读了我给你的帖子。