django - 创建一个 web url 来监听 redis pubsub 发布的消息

标签 django nginx real-time redis publish-subscribe

编辑 好的,我有一个来自 javascript 的长轮询,它与 django View 对话。 View 如下所示。它丢失了我从 channel 中的 redis 客户端发布的一些消息。另外我不应该为每个请求连接到 redis(也许 redis 变量可以保存在 session 中?) 如果有人能指出我需要做哪些更改才能使此 View 在长轮询下工作,那就太棒了!谢谢!

    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 sockets,我认为长轮询是正确的选择。现在我正在寻找比常规轮询更好地扩展并且易于与 python django 堆栈集成的东西。完成此开发后,我计划评估其他 python 框架(tornado twister、gevent 等)。

我做了一些研究并且喜欢 redis 的 pubsub 机制。聊天消息被发布到两个用户都已订阅的 channel 。以下是我的问题:

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

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

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

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

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

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

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

谢谢!

最佳答案

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

关于django - 创建一个 web url 来监听 redis pubsub 发布的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7786252/

相关文章:

python - 从父类别 django rest 获取所有产品

c++ - 如何使用 fastcgi C/C++ 应用程序访问 POST 请求的主体

networking - 实时应用环境中的延迟和抖动有什么区别?

python - 如何将自定义元素列表正确传递给类属性?

django - 在服务器初始化时执行模型操作(仅一次)

python - pootle 2.7 中的 update_against_templates 是什么?

docker - Nginx与docker,找不到与斜杠不同的位置

Nginx 文件描述符限制

c - C/C++ 中的实时间隔

php - gmail 和 Github 等 laravel 实时应用程序的要求