【问题标题】:creating a web url that listens to redis pubsub published message创建一个监听 redis pubsub 发布消息的 web url
【发布时间】: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 机制。聊天消息将发布到两个用户都已订阅的频道。以下是我的问题:

  1. 据我了解,Apache 无法很好地扩展,因为长轮询很快就会遇到进程/线程限制。因此,我决定切换到 nginx。这个理由正确吗?还有我担心的 nginx 中涉及的任何问题吗?特别是,我担心最新版本不支持 http 1.1 进行代理传递,正如 http://www.letseehere.com/reverse-proxy-web-sockets 的博客文章中提到的那样?

  2. 如何在浏览器端创建消息订阅的客户端部分?在我看来,这将是 javascript 代码“长轮询”的 url。所以在javascript级别,客户端会轮询一个在服务器端以“非阻塞方式”被“阻塞”的url。当结果(在这种情况下是一条新的聊天消息)出现时,服务器会返回结果。 Javascript 做它需要做的事情,然后再次轮询相同的 url。这种想法正确吗?当 javascript 循环暂停时,间隔之间会发生什么 - 我们是否会丢失来自服务器端的任何消息。

本质上,我想创建以下内容:

  1. 从 redis,我将消息发布到频道“foo”(也可以使用 redis-cli - 以后很容易将其合并到 python/django 中)

  2. 我希望在两个使用相同 js 代码轮询的浏览器窗口中显示相同的消息。假设浏览器代码知道用于测试目的的通道名称

  3. 我发布了第二条消息,该消息再次出现在两个浏览器窗口中。

我是实时应用程序的新手,因此对任何可能没有意义的问题表示歉意。

谢谢!

【问题讨论】:

    标签: django nginx real-time redis publish-subscribe


    【解决方案1】:

    好吧,只是部分回答您的问题并在众多选项中提及一个选项:Gunicorn 与异步工作者类一起使用是一种非常容易设置的长轮询/非阻塞请求的解决方案!

    【讨论】:

    • 谢谢!我曾简要阅读过 gunicorn 。我正在再次阅读它。当您编写如上所述的“订阅消息”请求的 http 端部分时,您的 django 代码看起来如何?它如何影响其他已经编写的 django 代码?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多