【问题标题】:Chat / System Communication App (Nodejs + RabbitMQ)聊天/系统通讯应用(Nodejs + RabbitMQ)
【发布时间】:2016-10-02 05:44:15
【问题描述】:

所以我目前有一个运行 NodeJS 的聊天系统,它通过 rabbit 传递消息,每个连接的用户都有自己独特的队列,订阅并只收听消息(仅限他们)。后端还可以使用此聊天管道来传达其他系统消息,例如通知/好友请求和其他用户事件驱动的信息。

目前,即使对于 1000 个用户来说,消息的有效负载相同,后端也必须逐个循环并发布每个用户的每条消息。我想摆脱这种情况,能够将相同的消息发送给多个不同的用户,但不是 EVERY 连接的用户。

(例如:通知某些用户他们的朋友已经上线)。

我考虑实现一个兔子队列系统,其中所有消息都汇集到同一个队列中,而不是兔子发送所有用户队列节点接收这些消息并通过套接字连接将消息发送给适当的用户(给在线的人)。

Proposed - infrastructure

这样,后端不需要为 100 和 1000 名用户循环,并且可以发送包含该消息应该发送到的所有用户的单个有效负载。我确实计划将 nodejs 服务器集群在一起。

我也想知道,因为我从未在生产环境中这样做过,我是否需要跟踪每个 socketID。

到目前为止我发现的潜在缺陷:

  • 速度较慢,因为 1000 条消息可以堆积在一个队列中。
  • 手动存储套接字 ID 以手动传输给用户。
  • 将路由卸载到 NodeJS 而不是 RabbitMQ

以前有人做过这样的事吗?如果是这样,你有什么建议。使用用户唯一队列进行扩展,还是将所有用户的所有分组消息集中到更小(但更大的池)队列中更好。

【问题讨论】:

  • 基础架构图用什么软件?

标签: node.js sockets rabbitmq chat cluster-computing


【解决方案1】:

一般来说,queue-per-user 是一种反模式。这有一些有效的用途,但我从来没有看到它是一个聊天应用程序的好主意(尽管所有的演示都使用这个例子)

RabbitMQ 可以成为促进系统间消息传递的绝佳工具,but it shouldn't be used to push messages to users

我考虑实现一个兔子队列系统,其中所有消息都汇集到同一个队列中,而不是兔子发送所有用户队列节点接收这些消息并通过套接字连接将消息发送给适当的用户(给在线的人)。

这是朝着正确的方向前进,但您必须记住 RabbitMQ 不是数据库(再次参见上一个链接)。

您不能随机查找队列中的特定消息,然后将它们留在那里。他们是先进先出的。

在聊天应用程序中,我会让 rabbitmq 处理您的系统之间的消息传递,但不参与传递给用户。

您对使用 Web 套接字的想法将成为您想要实现的方向。要么那个,要么Server Sent Events

如果您需要消息的持久性(历史记录、搜索、上次查看的位置等),请为此使用数据库。保留用户停止位置的时间戳或其他标记,并从该位置开始向他们推送消息。

您对跟踪用户套接字的担忧绝对值得考虑。

如果您的节点服务器有多个实例运行套接字并连接了不同的用户,您将需要一种方法来了解哪些用户连接到了哪个节点服务器。

这可能是 rabbitmq 的一个很好的用例——但不是以每用户队列的方式。相反,在每个用户绑定中。您可以让每个节点服务器创建一个队列以从发布消息的交换器接收消息。然后,节点服务器将根据登录到该特定节点服务器的用户 ID 在交换和队列之间创建绑定

不过,这可能会导致 rmq 中的绑定数量过多。

您可能需要一种更智能的方法来跟踪哪个服务器连接了哪些用户,或者完全忽略它并将每条消息广播到每个节点服务器。在这种情况下,每个服务器都会根据消息应该被传递给谁,通过 websocket 发布一个事件。

如果您使用的是足够智能的 websocket 库,它只会将消息发送给需要它的人。 socket.io 做到了,我知道,而且我确信其他 websocket 库也像这样聪明。

...

我可能没有就你的情况给你一个具体的答案,我相信你还有更多的背景需要考虑。不过,希望这能让你走上正确的道路。

【讨论】:

  • 感谢您的回复,我确实做了一些谷歌搜索,您的博客是我首先访问的地方之一,但是经过进一步研究,我使用的用户数量 (200k+) 导致希望使用面向每个用户(facebook)的队列/通道的架构。这似乎最终以编程方式成为更好的方法。在 NodeJS 层上,我使用的是 Socket.IO,所以听到它在技术上会忽略不针对特定用户的消息是个好消息,但是我使用的是我的系统自己分配的通过套接字连接发送的用户 ID。
猜你喜欢
  • 2015-12-29
  • 1970-01-01
  • 2021-03-08
  • 2013-02-02
  • 2020-12-29
  • 2018-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多