我正在为我们的页面(社交游戏类型)构建Facebook样式通知系统,现在我正在研究设计此类系统的最佳方式。我对如何将通知推送给用户或类似的东西不感兴趣(现在甚至是)。我正在研究如何在服务器上构建系统(如何存储通知,如何存储它们,如何获取它们等)。构建通知系统
所以......一些要求,我们有:
- 在高峰时期,我们有1K左右同时登录用户(以及更多的客人,但他们不事这里他们不会有通知)会产生很多事件
- 会有不同类型的通知(用户A已将您添加为朋友,用户B已对您的个人资料发表了评论,用户C已经喜欢您的图片,用户D已经在游戏X中击败了您,...)
- 大多数事件会为1个用户生成1个通知(用户X已经喜欢您的图片),但会出现一种情况t会生成很多通知(例如用户Y的生日)
- 通知应该组合在一起;如果例如四个不同的用户喜欢一些图像,该图像的所有者应该得到一个通知,指出四个用户都喜欢的形象,而不是四个单独的通知(就像FB一样)
行,所以我在想什么我应该创建一些队列,以便在事件发生时存储事件。然后我会有一个后台作业(gearman?),它会查看该队列并根据这些事件生成通知。这项工作然后将通知存储在每个用户的数据库中(所以如果一个事件影响10个用户,将会有10个单独的通知)。然后,当用户打开一个包含通知列表的页面时,我会阅读所有这些通知(我们希望限制为100个最新通知)并将它们组合在一起,然后显示出来。
事情我很担心这种做法:
- 复杂的地狱:)
- 在数据库这里最好的存储(我们正在使用MySQL),或者我应该用别的东西(Redis的好像也很适合)
- 我应该存储什么作为通知?用户ID,发起事件的用户ID,事件类型(以便我可以将它们分组并显示适当的文本),但是我有点不知道如何存储通知的实际数据(例如URL &标题被喜欢的图像)。我应该在生成通知时“烘焙”该信息,还是应该存储受影响的记录(图像,配置文件等)的ID,并在显示通知时将信息从数据库中拉出。
- 即使我在显示通知页面时不得不处理100个通知,在这里性能仍然可以正常运行
- 每个请求可能存在性能问题,因为我必须向用户显示未读通知的数量(这可能是一个问题,因为我会将通知分组在一起)。这可以避免,虽然如果我在后台生成通知视图(在何处分组),而不是即时的
因此,您如何看待我提出的解决方案和我的担忧?如果您认为我应该提及其他与此相关的内容,请发表评论。
哦,我们在页面上使用PHP,但这不应该是我认为的一个重要因素。
需要多少时间才能将此通知系统作为一个人的努力来完成。我只是想估计一下相应的时间表。 – Shaharyar 2015-11-24 10:55:36
@Shaharyar我认为这取决于通知系统的复杂性。 – tyan 2016-04-20 06:43:32
我使用与MySQL相同的系统来构建基于优先级的通知系统。好的是,它可以扩展到几千个用户,如果超过这个数字,它会爆炸,特别是Android和GCM。我想知道MySQL的替代品,比如redis,rabbitMQ,Kafka,它们自然地展现了一个消息队列,一种功能。 – 2017-01-23 13:57:33