【问题标题】:Need help setting up a logic behind a Facebook notification system style需要帮助设置 Facebook 通知系统样式背后的逻辑
【发布时间】:2013-09-19 00:58:10
【问题描述】:

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

谢谢,

【问题讨论】:

    标签: php logic


    【解决方案1】:

    我选择了 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 分钟运行一次。

    【讨论】:

      【解决方案2】:

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

      Building a notification system

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

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

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

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

      【讨论】:

      • 谢谢,我遵循使用 cronjob 为每个通知添加每个用户 1 个条目的路线。
      • 你的效果如何?你能回答你的问题,以便其他人可以看到你是如何做到的吗? @Henrique
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-02
      • 1970-01-01
      • 1970-01-01
      • 2014-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多