Django,socket.io,node.js - 管理私人消息和群组对话
Django, socket.io, node.js - Manage private messages and group conversations
我正在为 Facebook Messenger 或 WhatsApp 等服务编写后端。
我开始关注这个精彩的tutorial。
我使用 Python (Django) 中编写的 API 来执行此操作。
除了这个 API,我还有一个 Redis 进程和一个 node.js 服务器 运行 (localhost只要)。 node.js服务器使用socket.io库通过websockets进行实时通信
包含消息的 HTTP 请求可以从任何客户端发送到 Django API,后者又将消息发布到特定通道上的 Redis。
node.js 服务器已订阅 Redis 频道,并在发布此类消息时收到通知。 Node 跟踪哪些套接字当前与一组套接字 ID 连接,这些套接字 ID 以某个用户标识符为键。
我对此有几个问题:
1.私信
我想发送一条针对特定用户的消息。我最初的方法是让 HTTP 请求(发送到 Django)包括消息应该到达的用户。当此消息到达 node.js 服务器(通过 redis)时,节点可以在客户端数组中找到该用户。 Django 显然(?)需要知道哪个 socket.io 套接字属于哪个用户。即 Django 需要知道该节点应该使用哪个用户标识密钥来获取正确的套接字。
这是一个好方法吗?由于我只使用一个发布渠道,redis 服务器会成为瓶颈吗?如果源用户发送消息时消息的目标用户不在线怎么办?我想抓住那个事件并发送推送通知。
2。房间
如果没有启动和维护群组对话的功能,这项服务将毫无用处。根据我的阅读,我应该为此创建 socket.io:s rooms。那么我的问题是,我如何保持会话之间的空间?如果参与群组对话的每个用户都离线并因此从 node.js server:s 客户端数组中删除怎么办?我可以以某种方式在 Django 服务器中的会话之间存储房间吗?
非常感谢任何帮助and/or feedback/thoughts。
谢谢
- 私信
Node keeps track of which sockets that are currently connected with an array of socket ids keyed with some user identifier.
你说的差不多了。 Django 不需要知道目标用户的 socket id,但是 node.js 知道。如果您想向用户 3 发送消息,您可以将消息 + 目标用户(或您想要的任何其他元数据)发送到 Redis。 Node.js 将通过从套接字数组中读取 id 为 3 的元素来查找用户,并将消息发送到此连接。如果没有 id = 3 的元素,则用户离线,您可以发送推送通知。 Eather 在 node.js 或通过通知 django 服务器。
- 房间
既然您希望您的房间持久存在,您应该将它们存储在某种数据库中,例如 mysql 或 mongodb。 node.js 服务器将创建所有房间,如果用户连接,您可以使用他们的用户 ID 查找他们参与的房间。如果他们加入一个新房间,您必须更新数据库。如果创建新房间,node.js 需要创建 socket.io 房间并且数据库也需要更新。
我正在为 Facebook Messenger 或 WhatsApp 等服务编写后端。
我开始关注这个精彩的tutorial。
我使用 Python (Django) 中编写的 API 来执行此操作。 除了这个 API,我还有一个 Redis 进程和一个 node.js 服务器 运行 (localhost只要)。 node.js服务器使用socket.io库通过websockets进行实时通信
包含消息的 HTTP 请求可以从任何客户端发送到 Django API,后者又将消息发布到特定通道上的 Redis。
node.js 服务器已订阅 Redis 频道,并在发布此类消息时收到通知。 Node 跟踪哪些套接字当前与一组套接字 ID 连接,这些套接字 ID 以某个用户标识符为键。
我对此有几个问题:
1.私信
我想发送一条针对特定用户的消息。我最初的方法是让 HTTP 请求(发送到 Django)包括消息应该到达的用户。当此消息到达 node.js 服务器(通过 redis)时,节点可以在客户端数组中找到该用户。 Django 显然(?)需要知道哪个 socket.io 套接字属于哪个用户。即 Django 需要知道该节点应该使用哪个用户标识密钥来获取正确的套接字。
这是一个好方法吗?由于我只使用一个发布渠道,redis 服务器会成为瓶颈吗?如果源用户发送消息时消息的目标用户不在线怎么办?我想抓住那个事件并发送推送通知。
2。房间
如果没有启动和维护群组对话的功能,这项服务将毫无用处。根据我的阅读,我应该为此创建 socket.io:s rooms。那么我的问题是,我如何保持会话之间的空间?如果参与群组对话的每个用户都离线并因此从 node.js server:s 客户端数组中删除怎么办?我可以以某种方式在 Django 服务器中的会话之间存储房间吗?
非常感谢任何帮助and/or feedback/thoughts。 谢谢
- 私信
Node keeps track of which sockets that are currently connected with an array of socket ids keyed with some user identifier.
你说的差不多了。 Django 不需要知道目标用户的 socket id,但是 node.js 知道。如果您想向用户 3 发送消息,您可以将消息 + 目标用户(或您想要的任何其他元数据)发送到 Redis。 Node.js 将通过从套接字数组中读取 id 为 3 的元素来查找用户,并将消息发送到此连接。如果没有 id = 3 的元素,则用户离线,您可以发送推送通知。 Eather 在 node.js 或通过通知 django 服务器。
- 房间
既然您希望您的房间持久存在,您应该将它们存储在某种数据库中,例如 mysql 或 mongodb。 node.js 服务器将创建所有房间,如果用户连接,您可以使用他们的用户 ID 查找他们参与的房间。如果他们加入一个新房间,您必须更新数据库。如果创建新房间,node.js 需要创建 socket.io 房间并且数据库也需要更新。