我使用notifications
表和subnotifications
表,我也使用队列,因此当用户发布内容时它会在后台运行。当用户有10个关注者并且他们创建帖子时,notifications
表获取包含通知的帖子数据的单个条目,subnotifications
表获得10个条目(每个关注者一个子通知,每个引用通知的ID,因此我们不必重复通知数据10次,read_at
知道是否被该关注者读取了。
这很快,效果很好,没有任何问题。但是,当使用100万粉丝进行测试时,插入一个帖子的子通知大约需要 ~6小时!这当然是不可接受的,因为插入100万个子通知需要很长时间,每个跟随者一个。想象一下,同一个用户发布了10个帖子,就像 ~60小时的插入和1000万个子通知行。
我只是希望关注者知道如果他们还没有阅读它,就会有新帖子。是否有更好,更有效的扩展方式?
更新:坚持当前的方法见下文......
如果关注者$user
有100位领导者,他们会关注(他们会按照跟随者表格中不同的created_at
时间戳进行跟踪),那么从领导者那里了解领导者新帖子的正确答案是什么?跟随者跟随每个领导者的时间?我使用这个伪代码卡在created_at
:
// Assume `leader_id` is a column in the notifications table
DB::table('notifications')
->whereIn('leader_id', $leaderIds)
->where(`created_at`, '>', $whatTimestampsGoHere)
->paginate(20);
有100个不同的时间戳,我坚持如何正确有效地解决这个问题。有什么想法吗?
答案 0 :(得分:1)
如评论中所述,如果您只在用户阅读时插入子表(即subnotifications
而不是在创建通知时创建它,则可以减少插入,这可以避免此问题。
在尝试检查用户是否已看到通知时,只需检查subnotifications
中是否存在相关用户和通知。
同样如上所述,当向用户显示通知时,会向notifications
提取这些通知,但会将通知限制为后创建的通知,以便用户开始关注,以便新用户不会淹没了通知。