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

时间:2015-06-01 05:34:10

标签: django node.js websocket redis socket.io

我正在为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服务器的会话之间存储空间吗?。

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

1 个答案:

答案 0 :(得分:2)

  1. 私信
  2.   

    Node会跟踪当前与一个使用某个用户标识符键入的套接字ID数组连接的套接字。

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

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