在Node.js中实现通知队列

时间:2019-08-06 16:22:39

标签: javascript node.js redis push-notification

背景:想象一下像Instagram这样的应用程序,您可以在其中提交帖子,其他人也可以喜欢它们。每当有人喜欢您的信息时,您都会收到通知。

要求:我们不应该在有人喜欢您的特定帖子时发送通知。对于发送方式和通知,我们应该保持聪明。

这是一个例子:

假设您在晚上8:27 发布了一条信息。我喜欢你的帖子。在5秒钟内,您的另一个朋友喜欢了同一则帖子。用户可以获得以下通知:

  1. Emma Watson喜欢您的帖子。
  2. Natalia Dyer喜欢您的帖子。

不过,有20个人在5秒内喜欢该帖子。由于我们不想用通知轰炸用户,因此,我们应该明智地将其吸引在一起并说:

  1. Natalia Dyer和另外1个人喜欢您的帖子。

我们该怎么做?

当“ LIKE A POST” API被点击时,我们如何发送通知?如何将通知合并为一个?

一个可能错误的解决方案::当该API被点击时,我们在redis中存储应该向该用户发送有关此帖子的通知。

然后,那个reddit队列的使用者每五秒钟弹出一次。

如果我们在消费者选择通知之前收到通知,则会删除redis缓存中的上一个条目,并将其替换为新的通知。

然后,五秒钟后,如果没有其他女演员喜欢我们的帖子,我们会收到一条通知: Natalia Dyer和另外1个人喜欢您的帖子

让我知道这是否是一个有效的合法解决方案。如果可以,它是否可扩展?

欢迎任何新的想法/想法,我很期待它们。

1 个答案:

答案 0 :(得分:0)

您可以使用better-queue创建一个具有batchDelay的队列并合并重复的任务。

在您的示例中,batchDelay为5秒,您可以构建taskId = postId + actionId

postId唯一地标识帖子,而actionId类似于“ likeAction”。

通过这种方式,在5秒钟的时间窗口中,同一条帖子的所有类似通知将具有相同的taskId,并将被合并为一个任务。

让我知道它是否对您有用!