我正在为我们的页面(社交游戏类型)构建一个 Facebook 风格的通知系统,现在我正在研究设计这种系统的最佳方法。我对如何向用户推送通知或类似的东西不感兴趣(现在甚至不感兴趣)。我正在研究如何在服务器上构建系统(如何存储通知,在哪里存储通知,如何获取通知等等)。.).
所以,我们有一些要求:
- 在高峰时期,我们有大约1000个并发登录用户(还有更多的客户,但他们在这里并不重要,因为他们不会有通知) ,这将生成许多事件
- 会有不同类型的通知(用户 A 加你为好友,用户 B 在你的个人资料上发表评论,用户 C 喜欢你的图片,用户 D 在游戏 X 上击败了你,...)
- 大多数事件将为1个用户生成1个通知(用户 X 喜欢您的图像) ,但是在某些情况下,一个事件将生成多个通知(例如,用户 Y 的生日)
- 通知应该组合在一起; 例如,如果四个不同的用户喜欢某个图像,该图像的所有者应该得到一个通知,说明四个用户喜欢该图像,而不是四个独立的通知(就像 FB 做的那样)
我想的是,我应该创建一个队列在事件发生的时候存储它们。然后我会有一个背景工作(Gearman?)它将查看该队列并根据这些事件生成通知。然后,这个作业将在数据库中为每个用户存储通知(因此,如果一个事件影响10个用户,将有10个单独的通知)。然后当用户打开一个有通知列表的页面时,我会为他阅读所有这些通知(我们正在考虑将其限制在100个最新通知) ,并将它们组合在一起,最后显示它们。
关于这种方法,我关心的是:
- 非常复杂:)
- 是数据库最好的存储在这里(我们正在使用 MySQL)或者我应该使用其他东西(重排似乎是一个很好的适合太)
- 我应该存储什么作为通知?用户 ID,发起事件的用户 ID,事件的类型(这样我就可以将它们分组并显示适当的文本) ,但是我有点不知道如何存储通知的实际数据(例如,喜欢的图片的 URL 和标题)。当我生成通知时,我是应该“烘烤”这些信息,还是应该存储受影响的记录(图像、配置文件、 ...)的 ID,并在显示通知时从数据库中提取信息。
- 这里的性能应该没问题,即使在显示通知页面时,我必须处理100个即时通知
- 每个请求都可能出现性能问题,因为我必须向用户显示未读通知的数量(这本身就是一个问题,因为我要将通知分组在一起)。不过,如果我在后台生成通知视图(通知分组的位置) ,而不是动态生成,就可以避免这种情况
那么你对我提出的解决方案和我的担忧有什么看法?如果你认为我应该提及任何其他与此相关的事情,请予以评论。
哦,我们正在使用 PHP 作为我们的页面,但我认为这不应该是一个很大的因素。