使用 Redis 的 Django 聊天应用程序 - 订阅后如何/在哪里"listen"消息?



所以我试图用django写一个聊天系统(我是相对较新的实时系统)。我做了一些研究-有很多选择(扭曲,龙卷风等),但现在我决定尝试使用nginx作为web服务器和redis的pubsub。

聊天将在两个用户之间进行。

我是这么想的:

  1. 在认证时,所有用户发出psubscribe chatctrl:*:。这实际上订阅了一个控制通道,以建立始终需要的初始对话

  2. 当用户u1与用户u2发起聊天时,我们

  3. 创建一个频道,输入"chat:u1:u2"并订阅。

  4. 用户u1发布消息到控制通道chatctrl:u1:u2:(一个将被u2收听的控制消息)有效地说"你想和我在频道"chat:u1:u2"上聊天吗?

  5. 用户u2应该获得此消息,订阅该通道,并通过控制通道(或新建立的通道)上的另一条消息响应yes。
  6. 建立会话,两个用户都可以发布到同一频道并收听会话。

我的问题是:1. 首先,上述内容有意义吗?如果不是,你将如何使用redis?2. 第二个问题是我把循环放在哪里来监听消息。因为当没有消息时,它会"阻塞",所以它不能进入视图或视图访问的模型。它应该是在一个衍生线程,如果是这样,我如何取消订阅一旦聊天会话结束?

谢谢!

您所描述的系统示例请参见我的回答。

在该代码中,视图生成一个订阅Redis的Gevent greenlet,并通过socket.io将消息推送到客户端浏览器。

然后视图阻塞,直到通过套接字接收到消息。Io,在聊天会话期间重复。

希望有帮助!

最新更新