Notifications 建立通知系统

Notifications 建立通知系统,notifications,Notifications,我刚开始为我们的页面(社交游戏类型)构建Facebook风格的通知系统,现在我正在研究设计这种系统的最佳方式。我对如何向用户推送通知或诸如此类的事情不感兴趣(甚至现在)。我正在研究如何在服务器上构建系统(如何存储通知、在何处存储通知、如何获取通知等) 所以。。。我们有一些要求: 在高峰时间,我们有大约1k个并发登录用户(以及更多的来宾,但他们在这里并不重要,因为他们没有通知),这将生成许多事件 将有不同类型的通知(用户A将您添加为好友,用户B对您的个人资料发表了评论,用户C喜欢您的图像,用户D

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

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

  • 在高峰时间,我们有大约1k个并发登录用户(以及更多的来宾,但他们在这里并不重要,因为他们没有通知),这将生成许多事件
  • 将有不同类型的通知(用户A将您添加为好友,用户B对您的个人资料发表了评论,用户C喜欢您的图像,用户D在游戏X中击败了您,…)
  • 大多数事件将为1个用户生成1个通知(用户X喜欢您的图像),但也有一些情况下,一个事件将生成多个通知(例如,这是用户Y的生日)
  • 通知应分组在一起;例如,如果四个不同的用户喜欢某个图像,那么该图像的所有者应该收到一个通知,说明四个用户喜欢该图像,而不是四个单独的通知(就像FB那样)
好的,我想的是,我应该创建一些队列,在那里我可以存储事件发生时发生的事件。然后我将有一个后台作业(?),它将查看该队列并根据这些事件生成通知。然后,此作业将在数据库中为每个用户存储通知(因此,如果一个事件影响10个用户,则将有10个单独的通知)。然后,当用户打开一个包含通知列表的页面时,我会为他阅读所有这些通知(我们考虑将其限制为100个最新通知),并将它们分组,最后显示它们

我对这种方法所关心的事情:

  • 非常复杂:)
  • 数据库是这里最好的存储(我们使用的是MySQL)还是我应该使用其他存储(redis似乎也很适合)
  • 我应该存储什么作为通知?用户ID、发起事件的用户ID、事件类型(以便我可以对它们进行分组并显示适当的文本),但我不知道如何存储通知的实际数据(例如,喜欢的图像的URL和标题)。我应该在生成通知时“烘焙”该信息,还是应该存储受影响记录的ID(图像、配置文件等),并在显示通知时将信息从数据库中取出
  • 这里的性能应该还可以,即使我在显示通知页面时必须动态处理100个通知
  • 每个请求都可能出现性能问题,因为我必须向用户显示未读通知的数量(这本身可能是个问题,因为我会将通知分组在一起)。但是,如果我在后台而不是在运行中生成通知视图(它们在其中分组),这是可以避免的
那么,您对我提出的解决方案和我的担忧有何看法?如果您认为我应该提及任何其他与此相关的内容,请发表评论


哦,我们的页面使用PHP,但我认为这不应该是一个很大的因素。

这确实是一个抽象的问题,所以我想我们将不得不讨论它,而不是指出你应该或不应该做什么

以下是我对您关注的问题的看法:

  • 是的,通知系统很复杂,但并不像地狱般复杂。您可以有许多不同的方法来建模和实现这样的系统,它们可以具有从中等到高度的复杂性

  • 通常,我总是尝试让东西由数据库驱动。为什么?因为我可以保证完全控制正在发生的一切——但那只是我,你可以控制而不需要数据库驱动的方法;相信我,你会想控制那个案子的

  • 让我给你举一个真实的例子,这样你就可以从某个地方开始。在过去的一年里,我在某种社交网络(当然不像facebook)中建模并实现了一个通知系统。我过去在那里存储通知的方式?我有一个
    notifications
    表,在那里我保存了
    generator\u user\u id
    (生成通知的用户的id)、
    target\u user\u id
    (有点明显,不是吗?)和
    notification\u type\u id
    (它引用了具有通知类型的不同表),以及所有我们需要填写表格的必要材料(时间戳、标志等)。我的
    通知类型
    表用于与
    通知模板
    表建立关系,该表存储了每种通知类型的特定模板。例如,我有一个
    POST\u REPLY
    类型,它有一个类似
    {USER}的模板,它已经回复了你的一篇文章。从这里开始,我将
    {}
    作为变量,将
    #
    作为参考链接

  • 是的,性能应该并且必须正常。当您想到通知时,您会想到服务器从头到脚的推送。无论是使用ajax请求还是其他什么,您都必须担心性能。但我认为这是第二次担心


当然,我设计的模型不是唯一可以遵循的模型,也不是最好的模型。我希望我的回答至少能引导您进入正确的方向。

通知是关于某人(参与者)更改(动词=添加,请求…)并向用户(主题)报告的内容(对象=事件,友谊…)。这是一个规范化的数据结构(尽管我使用了MongoDB)。您需要将更改通知某些用户。所以是per-
╔═════════════╗      ╔═══════════════════╗      ╔════════════════════╗
║notification ║      ║notification_object║      ║notification_change ║
╟─────────────╢      ╟───────────────────╢      ╟────────────────────╢
║ID           ║—1:n—→║ID                 ║—1:n—→║ID                  ║
║userID       ║      ║notificationID     ║      ║notificationObjectID║
╚═════════════╝      ║object             ║      ║verb                ║
                     ╚═══════════════════╝      ║actor               ║
                                                ╚════════════════════╝
╔════════════════════╗
║notification        ║
╟────────────────────╢
║Username            ║
║Object              ║
║verb                ║
║actor               ║
║isRead              ║
╚════════════════════╝