我应该使用orbited还是gevent将comet功能集成到django应用中?

5 投票
2 回答
1446 浏览
提问于 2025-04-16 23:37

我已经在使用Django一段时间了,写了几个应用程序,环境是用Apache 2的mod_wsgi和PostgreSQL数据库在ubuntu上搭建的。

我有一个应用程序,它使用xsendfile通过Django视图从Apache提供文件,同时也允许用户通过表单上传文件。现在这一切都运行得很好,但我想增加一些功能(我知道这会让事情变得复杂),比如让用户可以聊天,并且在不刷新浏览器的情况下看到新文件的上传情况。

因为我希望这个应用能够扩展,所以我不想一直用AJAX去轮询,这样在用户多的时候会非常消耗资源。

我看过很多关于如何在Django应用中集成comet功能的帖子、网站和博客,但有太多不同的意见让我感到困惑。

我应该使用orbited、gevent还是iosocket呢?Tornado在这个讨论中又是什么角色?

我还希望消息能够存储在数据库中,所以我需要进行特别的配置来防止在写入数据库时阻塞我的应用吗?在Django中运行聊天服务器会对我从Apache提供文件的能力有影响吗?

2 个回答

1

你可以用Nginx加上X-Accel-Redirect来代替Apache加X-Sendfile。这样的话,你就可以在Nginx后面运行一个gevent/wsgi/django的服务器,处理一些需要长时间等待的请求,完全不需要单独的websockets服务器。

我之前在Webfaction上用过Apache加X-Sendfile和Nginx加X-Accel-Redirect,来提供一些需要权限保护的内容,结果都没有遇到任何问题。

7

我建议使用WebSockets来实现双向实时通信。你可以继续像现在这样运行Django,同时在另一个端口上运行一个WebSocket服务器。关于数据库的阻塞问题,你需要在编写WebSocket服务器时考虑到这一点,最好使用一个非阻塞的数据库驱动,或者想办法解决这个问题。

在客户端,你可以使用Socket.IO或者web-socket-js,这样可以支持一些老旧浏览器的闪存回退。

至于服务器,我个人推荐使用gevent或tornado。对于gevent,有gevent-websocketgevent-socketio,而tornado则自带WebSocket支持,如果你想用Socket.IO,可以使用tornadioEventlettwisted也都支持WebSockets。此外,还有一个很酷的新项目叫autobahn,它是基于twisted构建的,而meinheld也有WebSocket中间件可以使用。

WebSockets非常令人兴奋,因此有很多关于这个主题的优秀文章。我觉得以下这些文章很有用:

撰写回答