需要帮助建立Facebook通知系统风格背后的逻辑

时间:2013-09-19 00:58:10

标签: php logic

我想在我的网站上建立一个通知系统,类似于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分钟内网站管理添加的所有新闻,并在通知表中为系统中的每个用户插入一行...

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

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

    为了安全起见,您认为替代方案可以检查通知字段的所有事件吗?不是真的吗?同样的功能将抓住通知的事件' = false,将该通知添加到通知表后将其更新为true。

    谢谢,

2 个答案:

答案 0 :(得分:3)

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

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

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

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

    对于每个生成的通知,我为每个用户添加1个条目以进行通知。这就是我的通知db的样子:

    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分钟运行一次。

答案 1 :(得分:0)

我一直在研究这样的事情,我刚刚在stackoverflow上找到了这个问题

Building a notification system

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

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

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

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