【问题标题】:Django, socket.io, node.js - Manage private messages and group conversationsDjango、socket.io、node.js - 管理私人消息和群组对话
【发布时间】:2015-06-01 05:34:10
【问题描述】:

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

我开始关注这个精彩的tutorial

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

可以从任何客户端向 Django API 发送包含消息的 HTTP 请求,后者又将消息发布到特定通道上的 Redis。

node.js 服务器已订阅 Redis 频道,并在发布此类消息时收到通知。 Node 会跟踪哪些套接字当前与一组套接字 id 连接,这些套接字 id 以某个用户标识符为键。

我对此有几个问题:

1.私信

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

这是一个好方法吗?由于我只使用一个发布渠道,redis-server 会成为瓶颈吗?如果源用户发送消息时,消息的目标用户下线了怎么办?我想获取该事件并发送推送通知。

2。房间

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

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

【问题讨论】:

  • 您考虑过使用 SwampDragon 吗? swampdragon.net
  • 我实际上看到了那个框架。看起来不错。我仍然需要知道如何针对特定用户以及如何处理群组对话。
  • 虽然这不是 Socket 之类的框架,但我认为 Django-websocket-redis 对于您想用 Django 进行的任何套接字都非常有希望。对我来说,Socket.io/Node 的大部分困难在于维护一个完全独立的客户端框架,必须同时运行服务器等。这个模块避免了很多。

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


【解决方案1】:
  1. 私人消息

Node 跟踪当前连接的套接字与一组套接字 id 的连接,这些套接字 id 以某个用户标识符作为键。

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

  1. 房间

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

【讨论】:

  • 感谢您的回答。房间是处理私人消息的方式吗?
  • 如果您只想将它​​们发送给一个用户,您可以直接将它们发送给他们,而无需创建额外的房间
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-06
  • 1970-01-01
  • 2021-08-08
  • 2016-09-11
  • 1970-01-01
相关资源
最近更新 更多