我正在为Facebook Messenger或WhatsApp等服务编写后端。
我开始关注这个精彩的tutorial。
我使用用 Python(Django)编写的API来完成此操作。 与此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:s 房间。那么我的问题是,我如何保持会议之间的空间?如果参与群组对话的每个用户都脱机并因此从node.js服务器的客户端阵列中删除,该怎么办?我可以以某种方式在Django服务器的会话之间存储空间吗?。
非常感谢任何帮助和/或反馈/想法。 感谢
答案 0 :(得分:2)
Node会跟踪当前与一个使用某个用户标识符键入的套接字ID数组连接的套接字。
你几乎在那里说过。 Django不需要知道目标用户的套接字ID,但node.js确实如此。如果要向用户3发送消息,您将发送消息+目标用户(或您想要的任何其他元数据)到redis。 Node.js将通过从套接字数组中读取id为3的元素来查找用户,并将消息发送到此连接。如果没有id = 3的元素,则用户处于离线状态,您可以发送推送通知。收集node.js或通知django服务器。
由于您希望您的房间是持久的,您应该将它们存储在某种数据库中,例如mysql或mongodb。 node.js服务器将创建所有房间,如果用户连接,您可以使用其用户ID查找他们参与的房间。如果他们加入新房间,您必须更新数据库。如果创建了新房间,node.js需要创建socket.io房间,并且数据库也需要更新。