如何解决Redis Pub/Sub vs Node.JS EventEmitter 只处理一次事件
我对事件驱动应用程序和一般发布订阅的概念不熟悉,我正在努力寻找解决我目前正在使用 Node.JS 构建的 Web 应用程序问题的最佳方法和快递。
当新用户注册时,我想发出一个名为 user-signed-up
的新事件,以便可以在主服务之外处理诸如发送注册电子邮件之类的事情。该应用程序需要在未来对水平扩展开放,这就是我开始倾向于 Redis 发布订阅的原因,但据我所知,来自 Redis 的消息将被服务器集群中的每个节点处理,我不这样做'不希望针对特定事件发生(例如,我不希望每个订阅者都发送注册电子邮件;只发送一次)。
这让我认为最好的解决方案是将 Redis 用于需要在整个集群中共享的事件,但 EventEmitter 用于仅应处理一次的事件,以便它们由相同的 Node 实例处理它是在 .
我的问题是这是否是最好的方法,或者 Redis 是否有更好的方法(或者只向一个订阅者发送消息,或者是否有某种方法可以有条件地将集群中的一个节点订阅到特定的通道来处理应该只处理一次的事件)。
谢谢!
解决方法
您的问题过于宽泛,无法提供具体建议。不过,我可以提供一些可能有助于您做出决定的意见。
一般来说,EventEmitter
是在单个 Node.js 进程中进行通信的好方法。在处理事件之前,您必须考虑当您的进程停止或崩溃时会发生什么。您的新用户可能永远不会收到注册电子邮件。
同样,一般来说,Redis 可用于在多个进程之间进行通信。
如果你只想要一个进程来处理一个特定的事件,你可以用 Redis 创建一个“消息队列”。您可以使用 Redis 中的列表来执行此操作。您将新事件 RPUSH 到列表的末尾,您的工作人员从列表的开头处理 LPOP 事件。您可以使用 PUB/SUB 在新事件可用时通知工作人员。同样在此设置中,您必须考虑在 LPOP 处理事件之后但在处理事件之前工作进程停止或崩溃时会发生什么。您的新用户可能永远不会收到注册电子邮件。
如果您有使用传统 SQL 数据库的经验,也可以考虑使用 SQL 数据库代替 Redis。例如 PostgreSQL 有 NOTIFY/LISTEN,它类似于 PUB/SUB。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。