Django,socket.io,node.js – pipe理私人消息和群组对话

我正在编写Facebook Messenger或WhatsApp等服务的后端。

我开始遵循这个精彩的教程 。

我用一个用Python(Django)编写的API来做到这一点。 除了这个API之外,我还有一个Redis进程和一个运行node.js的服务器(仅限本地主机)。 node.js服务器使用socket.io库通过websockets进行实时通信

包含消息的HTTP请求可以从任何客户端发送到Django API,而Django API则将消息发布到某个通道上的Redis。

node.js服务器订阅了Redis通道,并在发布这样的消息时得到通知。 节点跟踪哪些套接字当前与一些用户标识符键入的套接字ID数组连接。

我有几个关于这个问题:

1.私人信息

我想发送针对某个用户的消息。 我最初的做法是让HTTP请求(发送给Django)包含消息应该到达哪个用户。 当此消息到达node.js服务器(通过redis)时,节点可以在一个客户端数组中find该用户。 Django显然(?)需要知道哪个socket.io套接字属于哪个用户。 即Django需要知道节点应该使用哪个用户标识键来获取正确的套接字。

这是一个好方法吗? 由于我只使用一个发布渠道,Redis服务器会成为瓶颈吗? 当源用户发送消息时,如果消息的目标用户处于脱机状态,会发生什么情况? 我想抓住这个事件并发送推送通知。

2.房间

如果没有启动和维护组对话的function,此服务将不会有任何好处。 从我读过的,我应该为此创buildsocket.io:s 房间 。 那么我的问题是,如何保持会话之间的空间? 如果参与群组会话的每个用户都脱机,并从node.js服务器的客户机arrays中删除。 我能以某种方式在Django服务器的会话之间存储会议室吗?

任何帮助和/或反馈/想法是不胜感激。 谢谢

  1. 私人信息

节点跟踪哪些套接字当前与一些用户标识符键入的套接字ID数组连接。

你几乎在那里说。 Django不需要知道目标用户的套接字标识,但是node.js可以。 如果你想发送一条消息给用户3,你会发送消息+目标用户(或任何其他元数据),以redis。 Node.js将通过从套接字数组中读取id为3的元素来查找用户,并将消息发送到此连接。 如果没有id = 3的元素,则用户处于脱机状态,您可以发送推送通知。 Ether在node.js中或通过通知Django服务器。

  1. 客房

既然你希望你的房间是持久的,你应该将它们存储在某种types的数据库,如mysql或mongodb。 node.js服务器将创build所有房间,如果用户连接,您可以使用其用户标识查找他们参与的房间。 如果他们join新房间,则必须更新数据库。 如果创build了新房间,node.js需要创buildsocket.io房间,并且数据库也需要更新。