使用 AMQP 和 Node.JS 进行实时数据同步

Posted

技术标签:

【中文标题】使用 AMQP 和 Node.JS 进行实时数据同步【英文标题】:Using AMQP and Node.JS for realtime data syncing 【发布时间】:2011-05-11 02:26:27 【问题描述】:

我正在构建一个基于 Web 的生产力应用程序,该应用程序必须处理适度的用户并发,并且我一直在探索各种选项来保持服务器和客户端之间的数据同步。应用程序数据在页面加载时被引导到 javascript,并使用 websocket 将数据推送到服务器。

对于一些上下文,我目前正在使用 Node.JS 和 Socket.IO 创建一个持久的客户端-服务器网关,它充当 Django 后端的代理。

挑战在于,我想让所有连接的客户端保持同步,以便在一个客户端会话上对应用程序的任何更改都会立即反映在所有连接的客户端会话上。困难在于并非所有用户都必须被允许查看所有数据;有各种不同的用户级别,不同的用户可以拥有略有不同的数据集。

因此,当一个对象以某种方式发生更改并将更改提交到数据库时,我需要知道我可以安全地将数据推送到当前连接的用户中的哪些用户。

我一直在探索不同的解决方案,我觉得这似乎可以通过 pubsub 消息队列处理 - 使用 AMQP 之类的东西,但我正在努力弄清楚应用程序的结构。

在我的脑海中,应用程序结构如下所示:

Client Node.JS gateway AMQP messaging queue Django app

我是否应该只创建一个直接交换,将 Node.js 和 Django 实例视为单个客户端,然后在 Node.js 中以某种方式过滤结果?

或者这种过滤是消息系统可以处理的,例如,每个连接的客户端订阅一个相关的主题,并且只接收他们被允许查看的数据?

我几乎没有使用消息传递系统的经验,所以我很难弄清楚它们在应用程序中能够扮演什么样的角色。任何建议将不胜感激。

【问题讨论】:

【参考方案1】:

我认为每个客户端订阅相关队列并将节点用作哑网关会容易得多。通常,将安全性尽可能地推到堆栈中是一个好主意。另外我认为,如果客户离线一段时间,处理起来会更容易,因为您可以将内容留在他们的队列中,稍后再将其推回。

【讨论】:

这是我的直觉,但我正在努力弄清楚 AMQP 如何过滤数据。我知道我可以建立一个主题交换并以这种方式发布信息,但我不确定如何围绕包装数据的细粒度权限系统进行调整。 我会接受这个答案,因为一般原则是绝对正确的;我需要对我的具体用例做更多的研究,但感谢你把我推上正确的轨道。

以上是关于使用 AMQP 和 Node.JS 进行实时数据同步的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 node.js、socket.io 和 mysql 显示实时数据?

用于实时多人游戏的 Node.js UDP

如何实现 Laravel、node.js、socket.io 和 redis 以使用数据库创建实时聊天/通知

使用 socket.io 技术实现消息实时推送

Elasticsearch:使用 Node.js 将实时数据提取到 Elasticsearch 中

利用 socket.io 实现消息实时推送