0

我使用一张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 个不同的时间戳,我被困在如何正确有效地解决这个问题上。有任何想法吗?

4

1 回答 1

1

如评论中所述,您可以减少插入,如果您只插入到子表中,即subnotifications当用户阅读它而不是在创建通知时创建它,这样可以避免这个问题。当尝试检查用户是否看到通知时,只需检查他们是否存在于subnotifications相关用户和通知中。

同样如前所述,在获取通知以向用户显示时,从中获取它们,notifications但将通知限制为在用户开始关注之后创建的通知,这样新用户就不会被通知淹没。

于 2018-03-29T14:33:18.090 回答