我正在开始为我们的页面(社交游戏类型)构建Facebook样式通知系统,现在我正在研究什么是设计此类系统的最佳方法。我对如何将通知推送给用户或诸如此类的东西不感兴趣(到目前为止)。我正在研究如何在服务器上构建系统(如何存储通知,将通知存储在哪里,如何获取通知等)。
所以...我们有一些要求:
- 在高峰时段,我们大约有1000个并发登录用户(还有更多的来宾,但他们在这里无关紧要,因为他们不会收到通知),这些事件会生成许多事件
- 会有不同类型的通知(用户A已将您添加为朋友,用户B已对您的个人资料发表评论,用户C喜欢您的图像,用户D在游戏X上击败了您,...)
- 大多数事件将为1个用户生成1条通知(用户X喜欢您的图片),但是在某些情况下,一个事件将生成许多通知(例如,用户Y的生日)
- 通知应分组在一起;例如,如果四个不同的用户喜欢某个图像,则该图像的所有者应收到一个通知,指出四个用户喜欢该图像,而不是四个单独的通知(就像FB一样)
好的,所以我当时想的是应该创建某种队列,以便在事件发生时存储事件。然后,我将有一个后台作业(gearman?),它将查看该队列并根据这些事件生成通知。然后,此作业会将每个用户的通知存储在数据库中(因此,如果一个事件影响10个用户,则将有10个单独的通知)。然后,当用户打开一个包含通知列表的页面时,我会为他阅读所有这些通知(我们打算将其限制为100个最新通知)并将它们组合在一起,最后显示它们。
我担心这种方法的事情:
- 复杂如地狱:)
- 是数据库的最佳存储(我们正在使用MySQL)还是我应该使用其他存储(redis似乎也很合适)
- 我应该将什么存储为通知?用户ID,发起事件的用户ID,事件的类型(以便我可以将其分组并显示适当的文本),但是我有点不知道如何存储通知的实际数据(例如,图片的URL和标题)很喜欢)。我应该在生成通知时只是“烘焙”该信息,还是应该存储受影响的记录的ID(图像,配置文件...),并在显示通知时将其从数据库中拉出。
- 即使在显示通知页面时我必须即时处理100条通知,此处的性能也应该可以
- 每个请求上可能存在性能问题,因为我必须向用户显示未读通知的数量(这可能是个问题,因为我会将通知分组在一起)。但是,如果我在后台而不是即时生成通知视图(将通知分组的位置),则可以避免这种情况
那么,您如何看待我提出的解决方案和担忧?如果您认为我应该在这里提及其他相关问题,请发表评论。
哦,我们在页面上使用的是PHP,但我认为这并不是一个大因素。