通过 Nginx(或 apache)与 Django 进行实时(长轮询)连接——减少查询次数
Posted
技术标签:
【中文标题】通过 Nginx(或 apache)与 Django 进行实时(长轮询)连接——减少查询次数【英文标题】:Live (long-polling) connection to Django, via Nginx (or apache) – reducing the number of queries 【发布时间】:2011-10-21 18:24:25 【问题描述】:我有这样的表:
class last10msg(models.Model):
user = models.ForeignKey(User)
date = models.DateField()
msg = models.CharField(max_length=254)
我想创建长轮询,在客户端更新一个表,从数据库中更新表中的最后 10 行。
一开始是这样的:
用户发送最后 10 行 table.server 响应的 ajax 请求,并且 js 代码更新表并更改或相同数据。然后用户发送另一个请求。
然后我想检查服务器上的数据是否是新的(将查询中的最新日期与用户通过 ajax 请求发送的表中的最新日期进行比较)发送响应,否则空闲 1 分钟,然后再次检查新发送响应是否空闲 1 英里。 .. .然后用户发送另一个请求。
最后:
我认为可以将所有请求发送到全局运行函数,并且此函数从上次检查中获取所有行,如果是新的(将日期与客户端的发送日期和 request.user 与用户字段进行比较)返回对相关视图的响应并查看响应没有关闭连接(可能用用户发送的日期替换查询中的最后一个日期,以便在下一个查询中进行比较,无需等待客户端在他的表中发送最后一个日期,这显然是相同的)并且在全局函数列表中进行下一次检查。而用户注销或关闭浏览器。
但我真的不知道如何实现。
编辑 1:
我找到了这个HTTP_Push_Module,但没有 Django 的示例以及如何为我的目的实现全局函数
编辑 2:
我认为这个问题的一小部分更好。
问题1:
如何创建这样的东西:link?
但使用 Django 而不是 php。
github.com/slact/nginx_http_push_module/blob/master/tests/test.py
上面是一个纯python的小例子。(我看不懂)
问题2: 如何创建全局函数来获取登录用户列表并通过长轮询返回与每个登录用户相关的最后更新行。
【问题讨论】:
【参考方案1】:嗯——好的,看:有点难以理解你的回答(所以如果我遗漏了什么,你可能想澄清一下你的语言)但是:我想我明白你在做什么.
如果您总是处理最后 10 条消息(或者实际上是最后 N 条消息,在这种情况下 N = 10),您可能会发现 Redis 非常适合。我设置了长轮询以通过 WebSockets 将队列工作程序的状态提供给接口小部件——我的应用程序是一个 Django 应用程序(在 nginx 前面的 gunicorn 上运行)但我为这个工作线程添加了一个很小的龙卷风类和它的WebSocket状态接口没有问题。
status 函数必须比较最后 N 个值;因为我在队列中使用 Redis 数据结构,所以在客户端 WebSocket 消费者中进行比较更容易——我有这种奢侈,因为取决于比较的行为只是 UI 状态,而不是数据更新或应用程序逻辑,我假设您担心类似的事情。
我的意思是,您提供的模型结构将适用于该任务,但它并不是特别适合。如果 Redis 和 Tornado 对您来说听起来太陌生,请考虑添加字段以将您的记录分组到每个会话集中......也许使用从您的会话标识符或类似的索引派生的索引。
如果有帮助,请告诉我。
【讨论】:
也仅供参考,我提到的包含 Tornado 队列状态服务器的项目在 github 上:github.com/fish2000/django-imagekit/blob/icc-develop/imagekit/… @fish2000 。我没有得到您的最后一段,请您详细说明一下(每个会话集部分)。如果您能解释更多 Django/Gunicorn-Tornado-Nginx 架构、事物的排列方式以及消息是如何来回传输的,我也将不胜感激......提前致谢 如果您能澄清上面提到的 Nginx 模块 (HTTP_Push_Module),以及它是如何使用的,或者即使是一开始就需要它,我也将不胜感激。以上是关于通过 Nginx(或 apache)与 Django 进行实时(长轮询)连接——减少查询次数的主要内容,如果未能解决你的问题,请参考以下文章