【发布时间】:2011-12-08 19:58:13
【问题描述】:
编辑 好的,我有一个来自 javascript 的长轮询,它与 django 视图对话。视图如下所示。它丢失了我从频道中的 redis 客户端发布的一些消息。另外我不应该为每个请求都连接到redis(也许redis变量可以保存在会话中?) 如果有人可以指出我需要使此视图与长轮询一起使用的更改,那就太棒了!谢谢!
def listen (request):
if request.session:
logger.info( 'request session: %s' %(request.session))
channel = request.GET.get('channel', None)
if channel:
logger.info('not in cache - first time - constructing redis object')
r = redis.Redis(host='localhost', port=6379, db=0)
p = r.pubsub()
logger.info('subscribing to channel: %s' %(channel))
p.psubscribe(channel)
logger.info('subscribed to channel: %s' %(channel))
message = p.listen().next()
logger.info('got msg %s' %(message))
return HttpResponse(json.dumps(message));
return HttpResponse('')
----原来的问题--- 我正在尝试创建一个聊天应用程序(使用 django、python)并试图避免轮询机制。我现在一直在努力解决这个问题 - 所以任何指针都会非常感激!
由于大多数浏览器不支持 web 套接字,我认为长轮询是正确的选择。现在我正在寻找比常规轮询更易于扩展并且易于与 python django 堆栈集成的东西。一旦我完成了这个开发,我打算评估一下其他的 python 框架(tornado twister、gevent 等)。
我做了一些研究,喜欢 redis pubsub 机制。聊天消息将发布到两个用户都已订阅的频道。以下是我的问题:
据我了解,Apache 无法很好地扩展,因为长轮询很快就会遇到进程/线程限制。因此,我决定切换到 nginx。这个理由正确吗?还有我担心的 nginx 中涉及的任何问题吗?特别是,我担心最新版本不支持 http 1.1 进行代理传递,正如 http://www.letseehere.com/reverse-proxy-web-sockets 的博客文章中提到的那样?
如何在浏览器端创建消息订阅的客户端部分?在我看来,这将是 javascript 代码“长轮询”的 url。所以在javascript级别,客户端会轮询一个在服务器端以“非阻塞方式”被“阻塞”的url。当结果(在这种情况下是一条新的聊天消息)出现时,服务器会返回结果。 Javascript 做它需要做的事情,然后再次轮询相同的 url。这种想法正确吗?当 javascript 循环暂停时,间隔之间会发生什么 - 我们是否会丢失来自服务器端的任何消息。
本质上,我想创建以下内容:
从 redis,我将消息发布到频道“foo”(也可以使用 redis-cli - 以后很容易将其合并到 python/django 中)
我希望在两个使用相同 js 代码轮询的浏览器窗口中显示相同的消息。假设浏览器代码知道用于测试目的的通道名称
我发布了第二条消息,该消息再次出现在两个浏览器窗口中。
我是实时应用程序的新手,因此对任何可能没有意义的问题表示歉意。
谢谢!
【问题讨论】:
标签: django nginx real-time redis publish-subscribe