gpt4 book ai didi

notifications - 构建通知系统

转载 作者:行者123 更新时间:2023-12-03 04:17:04 25 4
gpt4 key购买 nike

关闭。这个问题需要更多focused .它目前不接受答案。




2年前关闭。










锁定。这个问题及其答案是locked因为这个问题是题外话,但具有历史意义。它目前不接受新的答案或互动。








我刚开始为我们的页面(社交游戏类型)构建 Facebook 风格的通知系统,我现在正在研究设计此类系统的最佳方式。我对如何向用户推送通知或类似的东西(甚至现在)不感兴趣。我正在研究如何在服务器上构建系统(如何存储通知,在哪里存储它们,如何获取它们等等......)。

所以......我们有一些要求:

  • 在高峰时间,我们有大约 1000 个并发登录用户(还有更多 guest ,但他们在这里无关紧要,因为他们不会收到通知)将产生许多事件
  • 会有不同类型的通知(用户 A 将你加为好友,用户 B 评论了你的个人资料,用户 C 喜欢你的图片,用户 D 在游戏 X 中击败了你,......)
  • 大多数事件会为 1 个用户生成 1 个通知(用户 X 点赞了您的图片),但有时一个事件会生成多个通知(例如用户 Y 的生日)
  • 通知应组合在一起;例如,如果四个不同的用户喜欢某个图片,则该图片的所有者应该收到一个通知,说明四个用户喜欢该图片,而不是四个单独的通知(就像 FB 一样)

  • 好的,所以我的想法是我应该创建某种队列,以便在事件发生时存储它们。然后我会有一个后台作业( gearman ?)来查看该队列并根据这些事件生成通知。然后,此作业会将每个用户的通知存储在数据库中(因此,如果一个事件影响 10 个用户,则会有 10 个单独的通知)。然后,当用户打开带有通知列表的页面时,我会为他阅读所有这些通知(我们考虑将其限制为 100 个最新通知)并将它们组合在一起,然后最终显示它们。

    我担心这种方法的事情:
  • 复杂到 hell :)
  • 数据库是这里最好的存储(我们使用 MySQL)还是我应该使用其他东西(redis 似乎也很合适)
  • 我应该存储什么作为通知?用户 ID、发起事件的用户 ID、事件类型(以便我可以对它们进行分组并显示适当的文本)但是我有点不知道如何存储通知的实际数据(例如图像的 URL 和标题)被喜欢)。我应该在生成通知时“烘焙”该信息,还是应该存储受影响的记录(图像、配置文件等)的 ID,并在显示通知时将信息从数据库中提取出来。
  • 这里的性能应该没问题,即使我在显示通知页面时必须即时处理 100 个通知
  • 每个请求都可能出现性能问题,因为我必须向用户显示未读通知的数量(这本身可能是一个问题,因为我会将通知分组在一起)。如果我在后台生成通知 View (它们被分组的位置)而不是即时生成,则可以避免这种情况

  • 那么您如何看待我提出的解决方案和我的担忧?如果您认为我应该在这里提及任何其他相关的内容,请发表评论。

    哦,我们正在为我们的页面使用 PHP,但我认为这不应该是一个重要因素。

    最佳答案

    通知是关于某事(对象 = 事件、友谊..)被某人( Actor )更改(动词 = 添加、请求..)并报告给用户(主题)。这是一个规范化的数据结构(尽管我使用过 MongoDB)。您需要将更改通知某些用户。所以它是每个用户的通知......意味着如果有 100 个用户参与,你会生成 100 个通知。

    ╔═════════════╗      ╔═══════════════════╗      ╔════════════════════╗
    ║notification ║ ║notification_object║ ║notification_change ║
    ╟─────────────╢ ╟───────────────────╢ ╟────────────────────╢
    ║ID ║—1:n—→║ID ║—1:n—→║ID ║
    ║userID ║ ║notificationID ║ ║notificationObjectID║
    ╚═════════════╝ ║object ║ ║verb ║
    ╚═══════════════════╝ ║actor ║
    ╚════════════════════╝

    (添加您认为合适的时间字段)

    这基本上用于对每个对象的更改进行分组,以便您可以说“您有 3 个好友请求”。并且按 Actor 分组很有用,因此您可以说“用户詹姆斯邦德在您的床上进行了更改”。这也使您能够根据需要翻译和计算通知。

    但是,由于对象只是一个 ID,您需要通过单独的调用获取有关您想要的对象的所有额外信息,除非对象实际发生更改并且您想显示该历史记录(例如“用户将事件标题更改为... ”)

    由于站点上的用户的通知接近实时,我会将它们与 nodejs + websockets 客户端联系起来,当添加更改时,php 将所有监听器的更新推送到 nodejs。

    关于notifications - 构建通知系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9735578/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com