gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 11:03:16 26 4
gpt4 key购买 nike

编辑好的,我有一个来自 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com