NodeJS 和 MongoDB:在文档插入时向多个用户发送电子邮件和仪表板通知 [关闭]

Posted

技术标签:

【中文标题】NodeJS 和 MongoDB:在文档插入时向多个用户发送电子邮件和仪表板通知 [关闭]【英文标题】:NodeJS & MongoDB: Send emails and dashboard notifications to multiple users on document insertion [closed] 【发布时间】:2021-09-27 05:52:54 【问题描述】:

我正在使用 MEAN 堆栈开发应用程序。 具体来说,我使用的是 NestJS、Mongoose 和 Angular。 但是架构解释可以是简单的 NodeJS/ExpressJS 和 MongoDB。

我需要一些关于如何构建具有以下要求的系统的指导。

我有一个用例,当在 collection1 中插入文档时,我需要执行以下操作。

    collection2collection3 中的一组用户(可以是数千个)发送电子邮件 向 collection2collection3 中的一组用户(可以是数千)发送推送通知。用户的推送通知有最大限制,因此在超过数量后,需要删除非常旧的通知。

我所知道的

我曾经玩过一个基于 Redis 的 Node 队列,即 Kue,我现在看到了 Bull;这可用于对这些发送电子邮件和通知的过程进行排队。 我曾经使用SocketIO将消息从后端发送到前端 我看到 MongoDB 有更改流 (https://docs.mongodb.com/v3.6/changeStreams/);我不确定当在集合中添加新记录时它们是否也会发出。我会检查这个 (Watch document creation with MongoDB Streams) 我曾使用 Nodemailer 发送电子邮件。

现在我需要指导或重新考虑将它们拼凑在一起的逻辑。 而且我想知道我上面提到的这些工具是否可以满足这个要求。

例如,我可以执行以下步骤。

    collection1中插入数据时,对插入做出反应(MongoDB 更改流); 查询collection2collection3中所有匹配的用户文档。 循环遍历集合中的每个用户(collection2collection3) - 我不确定循环是否有效 对于每个用户;使用例如安排发送电子邮件的过程Bull 和 Nodemailer 对于每个用户;使用 socketIO 安排打开的套接字发送消息/通知。

我担心不为应用程序使用某些工具或技术。 我希望从一开始就采用最有效的方法并使用最有效的工具。 我正在考虑建立一个非常大的平台。

非常感谢任何想法、想法、阅读链接和建议。

【问题讨论】:

【参考方案1】:

我认为如果我们现在只关注需求而不是流程可能会更容易。

从你想要做的帖子中

发送电子邮件(可能是数千个)以及推送通知和发送到套接字服务器(可能是 socket.io)

现在,从工具的角度来看,使用 say

nodemailer(用于发送电子邮件) Socket.io(用于发送到套接字服务器) 解析,(推送服务填空)

应该都可以正常工作,最好将它们视为应用程序的独立部分,而不是相互依赖,因为每个服务都将请求传递给单独的服务器,例如

Nodemailer 将请求发送到 SMTP 服务器(mailgun、sendgrid、您拥有 smtp) Socket.io 将请求发送到您的套接字服务器,发送到所有通道 推送通知将请求发送到您的推送服务器以发送推送通知。

话虽如此,在您的应用程序中插入完成后,您希望

发送电子邮件 发送到套接字 发送推送通知

(有很多通知!:D)

因此,在对 DB 完成插入后,您可能需要查询 DB 以获取电子邮件,这可能还包含发送通道 (socket.io) 和推送通道。

一旦查询完成,您将为 nodemail 构建电子邮件对象,nodemail 确实支持批量电子邮件发送,因此您应该研究配置 SMTP 和池等。但是,如果电子邮件都是相同的,您可以简单地与所有用户一起构造 to OR BCC。那么这将只是与多个用户一起发送。不需要单独循环和发送,但是如果它是自定义的,您可能需要循环并发送每一个,因为它们是动态的(完全披露,您可以使用单个 JSON 文件执行此操作,但我不能肯定地说一)

一旦将请求发送到 SMTP 服务器,您就不再关心该过程(从节点端,即请求已发送,因此它将在该服务器上处理)

接下来,您将向套接字服务器发送一个发射,这将包含您希望发射到的“通道”,因此任何连接到它的用户都将获得该更新。同样,一旦完成,您就不再担心套接字服务器收到请求并将执行任何需要的逻辑并“发送”到通道(socket.io 的房间)

最后,我们将发布到推送通知服务器(我将使用 parse 作为示例,但大多数情况应该相同)

您的推送服务器应该有 API 密钥,以允许您发布到 api 并使用特定渠道发送推送通知。您只需构建对推送服务器的正确 API 调用,这不再是您关心的问题,因为推送服务器将负责发送通知。

每个动作都没有相互关联,因此您可以按任何顺序执行它们。

只是一些最后的想法,一开始你可能不会把它“正确”我认为更重要的是让事情正常工作,随手重构,保持敏捷。随着您的构建,应用程序的效率将呈现出来,新工具将出现,您将回顾第一条路线与最后一条路线相比,就像我在想的 WTF 一样。重要的是,你不要把事情复杂化。如果您将来找到一种更适合您需求的新工具,您可以将其换掉,因为它们不相互依赖。

【讨论】:

嗨@proxim0,非常感谢您提供如此详细的答案,它真的让我大开眼界,给了我一些想法,谢谢!

以上是关于NodeJS 和 MongoDB:在文档插入时向多个用户发送电子邮件和仪表板通知 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

使用mongodb在nodejs中使用锁定/事务读取和插入文档

优化nodejs mysql插入

使用 MongoDB 和 Nodejs 插入和查询日期

Mongodb插入50M文档而不重复的最佳方法

如何使用 mongoose 和 NodeJs 在 Mongodb 的数组字段中插入数据

使用 nodejs 和 chartjs 从 mongodb 插入和获取值