在 Node.js 中实现通知队列

Posted

技术标签:

【中文标题】在 Node.js 中实现通知队列【英文标题】:Implementing a Notificaion Queue in Node.js 【发布时间】:2019-08-06 16:22:39 【问题描述】:

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

要求:我们不应在每次有人喜欢您的特定帖子时发送通知。我们应该明智地了解我们发送通知的方式和类型。

这是一个例子:

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

    Emma Watson 赞了您的帖子。 Natalia Dyer 赞了您的帖子。

不过,假设 20 人在 5 秒内点赞了该帖子。既然我们不想用通知轰炸用户,我们应该聪明地给他们点赞并说:

    Natalia Dyer 和另外 1 人赞了您的帖子。

我们如何做到这一点?

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

可能是错误的解决方案:当该 API 被命中时,我们会在 redis 中存储一条通知应该针对该帖子发送给用户。

然后,该 reddit 队列的消费者每五秒弹出一次。

如果我们在消费者收到通知之前收到通知,我们会删除 redis 缓存中的先前条目并用我们的新通知替换它。

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

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

欢迎任何新的想法/迭代,我期待着他们。

【问题讨论】:

这是一个非常广泛的问题。你有任何你尝试过的代码吗? Stack Overflow 通常不从事咨询业务,因为这会导致固执己见的答案。 @IronFlare 不,只是一个想法。我有点期待opionated的答案。您会想到任何 StackExchange 社区,在那里我可以期待有用的 cmets 和答案? 没有想到那个特定的目的,但是如果您编写上述代码的工作版本first,您就可以发布将该代码发送给Code Review,这可能有助于推荐替代设计模式和更有效的解决方案。 如果在编写代码时遇到了困难,请随时将其发布到 Stack Overflow 上,因为我们的核心目的是帮助调试。 【参考方案1】:

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

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

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

这样,在 5 秒的时间窗口内,同一篇文章的所有类似通知都将具有相同的 taskId,并将合并到一个任务中。

让我知道它是否适合你!

【讨论】:

以上是关于在 Node.js 中实现通知队列的主要内容,如果未能解决你的问题,请参考以下文章

如何在 node.js 和 mongodb 中实现 geoip

如何在node.js中实现登录身份验证

node.js中实现同步操作的3种实现方法

在 Node JS 中实现微服务架构

Firebase 使用 Node Js 功能通知未在 android 中接收,但它直接从 firebase 面板工作

在 Node JS 应用程序中实现单例 mongoDB DB 对象