所以我试图用django写一个聊天系统(我是相对较新的实时系统)。我做了一些研究-有很多选择(扭曲,龙卷风等),但现在我决定尝试使用nginx作为web服务器和redis的pubsub。
聊天将在两个用户之间进行。
我是这么想的:
-
在认证时,所有用户发出psubscribe chatctrl:*:。这实际上订阅了一个控制通道,以建立始终需要的初始对话
-
当用户u1与用户u2发起聊天时,我们
-
创建一个频道,输入"chat:u1:u2"并订阅。
-
用户u1发布消息到控制通道chatctrl:u1:u2:(一个将被u2收听的控制消息)有效地说"你想和我在频道"chat:u1:u2"上聊天吗?
- 用户u2应该获得此消息,订阅该通道,并通过控制通道(或新建立的通道)上的另一条消息响应yes。
- 建立会话,两个用户都可以发布到同一频道并收听会话。
我的问题是:1. 首先,上述内容有意义吗?如果不是,你将如何使用redis?2. 第二个问题是我把循环放在哪里来监听消息。因为当没有消息时,它会"阻塞",所以它不能进入视图或视图访问的模型。它应该是在一个衍生线程,如果是这样,我如何取消订阅一旦聊天会话结束?
谢谢!
您所描述的系统示例请参见我的回答。
在该代码中,视图生成一个订阅Redis的Gevent greenlet,并通过socket.io将消息推送到客户端浏览器。
然后视图阻塞,直到通过套接字接收到消息。Io,在聊天会话期间重复。希望有帮助!