帖子更新后给所有关注帖子的用户发提醒,怎么实现最优雅,最简单,性能最高?

以论坛举例,有人发了一个帖子,当帖子有新回复时,默认要给楼主和所有回帖人发提醒,告诉他们这个帖子有更新,但是用户可以在消息设置里关闭回帖通知。

假设现在某个帖子有100层楼,现在有了第101个回复,就要读取前面100个回帖的用户配置,判断他们是否接收提醒,再发送通知。

如果是知乎这样,关注问题的人都做提醒的话,一个问题轻轻松松达到数万人关注,要读取上万人的消息接收配置。

即使现在异步化、分组化、用户配置缓存化,消耗也还是不小,如果帖子数本身又多,整站消耗依然是巨大的。

我能想到的最优方案就是,定时拉取或发送。

方案1:
按帖子为单位,如果帖子回帖数达到某个阈值Y,就不再直接发送新新帖提醒,而是添加一个异步任务每N分钟扫描一次,如果帖子有新回复,就给用户发送提醒,这样即使N分钟内有100个新回帖也只通知一次,如果C分钟内没有新回帖,就失活不再扫描;回复时判断如果在阈值Y下直接通知,如果达到Y,判断上一个最新回帖是否在C分钟内,如果在就是每失活不管,让扫描器通知,如果超过C分钟没有回复,说明帖子已经失活,扫描器已经放弃本帖,直接添加异步发送提醒任务,并且再次重启扫描器,防止挖坟帖又热起来。

方案2:
按用户为单位,定时轮询扫描每个用户关注的帖子有没有新回帖,有就生成提醒,只管活跃用户,非活跃用户上线时拉取一次。

方案1感觉还行,但还是不简单,有没有更简单可行可靠的方案。

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 18

存到 Redis,可以吗?

Redis 单实例,不是支持每秒百万读写吗?

算下来,可以支持每秒 100 人,回复 1W 人参与过的帖子?

如果每人占 1KB 内存的话,1GB 足够保存 100W 人的未读信息列表?

实在不行,Redis 只保留活跃用户的未读信息?

不活跃的,上线时遍历一次回复过的帖子,找有更新,且已读消息列表里没有的,即为未读消息?

(我经验很少,只是来学习讨论的)

3周前 评论
李铭昕 2周前
李铭昕 2周前
李铭昕 2周前
李铭昕 2周前
李铭昕 2周前
wxf666 (作者) 2周前
wxf666 (作者) 2周前
wxf666 (作者) 2周前
wxf666 (作者) 2周前
wxf666 (作者) 2周前

我觉得纯粹的异步处理不一定消耗很大

2周前 评论
滚球兽进化 (作者) 2周前

还要考虑本贴通知过的不再重复通知或者更新通知时间

2周前 评论

如果是上线在通知那在线再去获取未读消息列表就行,如果是要邮件或者App消息提醒只能异步处理和推送,我i觉得这个应该不是实时性要求很高的场景。

2周前 评论
YongzhenYe

对活跃用户使用推模式,非活跃用户上线后拉一次

2周前 评论

直接异步全发了不关心用户的设置是如何 用户主动/被动拉取的时候在读取用户的配置,他要是设置了不显示,不返回给前端就得了

2周前 评论

离线: 关注表,用户关注了哪些帖子 select from 关注表 where 更新时间 晚于我最后查看时间的

1周前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!