擅长:python、mysql、java
<p>正如Gregor Müllegger所指出的,Websockets不能被WSGI正确地处理,因为该协议从未被设计来处理这样的特性。
<a href="http://uwsgi-docs.readthedocs.org/en/latest/index.html">uWSGI</a>自1.9.11版以来,可以处理开箱即用的Websockets。在这里,uWSGI使用原始HTTP而不是WSGI协议与应用服务器通信。这样编写的服务器可以处理协议内部,并在很长一段时间内保持连接打开。使用Django视图处理长时间有效的连接也不是一个好主意,因为这样会阻塞工作线程,这是一个有限的资源。</p>
<p>Websockets的主要目的是让服务器以异步方式将消息推送到客户端。这可以是其他浏览器(如聊天客户端、多人游戏)触发的Django视图,也可以是Django芹菜(如sport results)触发的事件。因此,对于这些Django服务来说,使用消息队列将消息推送到客户机是最基本的。</p>
<p>为了以可伸缩的方式处理这个问题,我编写了<a href="http://django-websocket-redis.readthedocs.org/en/latest/index.html">django-websocket-redis</a>,一个Django模块,它可以使用Redis作为后端消息队列,在一个线程/进程中打开所有那些长时间存在的Websocket连接。</p>