我应该使用orbited还是gevent将comet功能集成到django应用中?
我已经在使用Django一段时间了,写了几个应用程序,环境是用Apache 2的mod_wsgi和PostgreSQL数据库在ubuntu上搭建的。
我有一个应用程序,它使用xsendfile通过Django视图从Apache提供文件,同时也允许用户通过表单上传文件。现在这一切都运行得很好,但我想增加一些功能(我知道这会让事情变得复杂),比如让用户可以聊天,并且在不刷新浏览器的情况下看到新文件的上传情况。
因为我希望这个应用能够扩展,所以我不想一直用AJAX去轮询,这样在用户多的时候会非常消耗资源。
我看过很多关于如何在Django应用中集成comet功能的帖子、网站和博客,但有太多不同的意见让我感到困惑。
我应该使用orbited、gevent还是iosocket呢?Tornado在这个讨论中又是什么角色?
我还希望消息能够存储在数据库中,所以我需要进行特别的配置来防止在写入数据库时阻塞我的应用吗?在Django中运行聊天服务器会对我从Apache提供文件的能力有影响吗?
2 个回答
你可以用Nginx加上X-Accel-Redirect来代替Apache加X-Sendfile。这样的话,你就可以在Nginx后面运行一个gevent/wsgi/django的服务器,处理一些需要长时间等待的请求,完全不需要单独的websockets服务器。
我之前在Webfaction上用过Apache加X-Sendfile和Nginx加X-Accel-Redirect,来提供一些需要权限保护的内容,结果都没有遇到任何问题。
我建议使用WebSockets来实现双向实时通信。你可以继续像现在这样运行Django,同时在另一个端口上运行一个WebSocket服务器。关于数据库的阻塞问题,你需要在编写WebSocket服务器时考虑到这一点,最好使用一个非阻塞的数据库驱动,或者想办法解决这个问题。
在客户端,你可以使用Socket.IO或者web-socket-js,这样可以支持一些老旧浏览器的闪存回退。
至于服务器,我个人推荐使用gevent或tornado。对于gevent,有gevent-websocket和gevent-socketio,而tornado则自带WebSocket支持,如果你想用Socket.IO,可以使用tornadio。Eventlet和twisted也都支持WebSockets。此外,还有一个很酷的新项目叫autobahn,它是基于twisted构建的,而meinheld也有WebSocket中间件可以使用。
WebSockets非常令人兴奋,因此有很多关于这个主题的优秀文章。我觉得以下这些文章很有用:
- http://gehrcke.de/2011/06/the-best-and-simplest-tools-to-create-a-basic-websocket-application-with-flash-fallback-and-python-on-the-server-side/
- http://codysoyland.com/2011/feb/6/evented-django-part-one-socketio-and-gevent/
- http://toastdriven.com/blog/2011/jul/31/gevent-long-polling-you/
- http://blog.jupo.org/post/8858247674/real-time-web-apps-with-django-and-websockets/