在 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