Django,socket.io,node.js - 管理私人消息和组对话

Eye*_*all 11 django websocket redis node.js socket.io

我正在为Facebook Messenger或WhatsApp等服务编写后端.

我开始关注这个精彩的教程.

我用Python编写的API (Django)来做这件事.除了这个API,我还有一个Redis进程和一个运行的node.js服务器(仅限localhost).node.js服务器使用socket.io库通过websockets进行实时通信

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

node.js服务器已订阅Redis频道,并在发布此类消息时收到通知.Node会跟踪当前与一个使用某个用户标识符键入的套接字ID数组连接的套接字.

我有几个问题:

1.私人讯息

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

这是一个好方法吗?redis-server是否会成为瓶颈,因为我只使用一个发布渠道?如果源用户发送消息时消息的目标用户处于脱机状态会发生什么?我想抓住那个事件并发送推送通知.

2.房间

如果没有启动和维护组对话的功能,则此服务不会有任何好处.根据我的阅读,我应该为此创建socket.io:的房间.那么我的问题是,我如何保持会议之间的空间?如果参与群组对话的每个用户都脱机并因此从node.js服务器的客户端阵列中删除,该怎么办?我可以以某种方式在Django服务器的会话之间存储空间吗?

非常感谢任何帮助和/或反馈/想法.谢谢

Mar*_*tin 3

  1. 私人信息

节点跟踪当前与以某些用户标识符为键的套接字 ID 数组连接的套接字。

你在那里已经说得差不多了。Django 不需要知道目标用户的套接字 ID,但 Node.js 需要。如果您想向用户 3 发送消息,您可以将消息 + 目标用户(或您想要的任何其他元数据)发送到 Redis。Node.js 将通过从套接字数组中读取 id 为 3 的元素来查找用户,并将消息发送到此连接。如果没有 id = 3 的元素,则用户处于离线状态,您可以发送推送通知。在 Node.js 中或者通过通知 django 服务器。

  1. 客房

由于您希望房间持久存在,因此应该将它们存储在某种数据库中,例如 mysql 或 mongodb。Node.js 服务器将创建所有房间,如果用户连接,您可以使用其用户 ID 查找他们参与的房间。如果他们加入新房间,您必须更新数据库。如果创建一个新房间,node.js 需要创建 socket.io 房间,并且数据库也需要更新。