byo*_*ngb 19 django nginx uwsgi
我有一个Django应用程序Web应用程序,我想知道是否有可能让nginx传播中止/接近uwsgi/Django.
基本上我知道nginx的是意识到过早中止/接近,因为它默认为uwsgi_ignore_client_abort"关",你会得到499个nginx的错误,在你的nginx的日志时,请求中止/关闭发送响应之前.一旦uwsgi完成处理请求,它将返回响应nginx时抛出"IO错误".
转向uwsgi_ignore_client_abort"on"只是让nginx不知道中止/关闭,并删除了uwsgi"IO错误",因为uwsgi仍然可以回写给nginx.
我的用例是我有一个应用程序,人们可以非常快速地通过一些ajax结果页面,因此如果快速页面通过我中止了他们跳过的页面的待处理ajax请求,这将使客户端保持清洁和高效.但这对服务器端(uwsgi/Django)没有任何作用,因为即使没有任何东西等待响应,它们仍然必须处理每个请求.
现在显然可能存在某些页面,我不希望请求因任何原因而过早中止.但我使用芹菜来处理可能属于该类别的长期运行请求.
这可能吗?uwsgi'shariakari设置让我觉得它在某种程度上......只是无法弄清楚如何去做.
我的用例是我有一个应用程序,人们可以非常快速地通过一些ajax结果页面,因此如果快速页面通过我中止了他们跳过的页面的待处理ajax请求,这将使客户端保持清洁和高效.
在客户端上中止AJAX请求是通过完成的XMLHttpRequest.abort().如果在abort()调用时尚未发出请求,则请求将不会发出.但是,如果请求已被发送,则服务器将不知道请求已被中止.连接不会关闭,不会有任何消息发送到服务器,什么都没有.如果您希望服务器知道不再需要请求,您基本上需要找到一种方法来识别请求,以便在您发出初始请求时获得它的标识符.然后,通过另一个AJAX请求,您可以告诉服务器应该取消先前的请求.(如果您搜索abort() 与此类似的问题并搜索"服务器",您会找到相同的解释.)
请注意,uwsgi_ignore_client_abort这是处理TCP级别的连接闭包的问题.这与中止AJAX请求不同.通常,您无法在JavaScript中采取任何需要关闭TCP连接的操作.浏览器优化连接的创建和销毁以满足其需求.刚才,我这样做了:
我曾经lsof检查过任何进程是否有连接example.com.没有.(lsof是一个允许列出打开文件的*nix实用程序.网络连接是*nix中的"文件".)
我在Chrome中打开了一个带有example.com的页面.lsof显示了连接和打开它的过程.
然后我关闭了页面.
我进行了调查,lsof看看我之前确定的连接是否仍然打开.在我关闭页面后它保持打开大约一分钟,即使没有真正需要保持连接打开.
并且没有任何摆弄uswgi设置会让它意识到通过执行的中止 XMLHttpRequest.abort()
您提供的用例场景是用户通过某些结果快速分页的场景.我可以看到问题中描述的两种可能性:
用户在进一步分页之前等待刷新.例如,Alice正在查看按字母顺序为用户"Zeno"排序的用户名列表,每次显示新页面时,她都会看到名称不在那里,页面向下.在这种情况下,没有什么可以中止的,因为用户的操作取决于首先处理的请求.(用户在做出决定之前必须先看新页面.)
用户只需向下翻页而无需等待刷新.爱丽丝再次寻找"芝诺",但她认为它将在最后一页上,所以点击,点击,点击她去.在这种情况下,您可以撤消对服务器的请求.然后按下一页按钮,增加应向用户显示的页面编号,但不立即发送请求.相反,在用户停止单击按钮然后发送带有最终页码的请求之后,您会等待一小段时间,因此您只需提出一个请求而不是十二个请求.以下是为DataTables搜索执行的去抖动示例.
现在显然可能有某些页面,我不希望请求因任何原因过早中止。
这正是采取这种方式或另一种方式背后的问题。
显然,您可能不想继续花费系统资源来处理已经中止的连接,例如,昂贵的搜索操作。
但是,也许连接足够重要,即使客户端断开连接,它仍然必须被处理。
例如,非常昂贵的搜索操作,但实际上不是特定于客户端的,并且也会由 nginx 为所有后续客户端缓存。
或者可能是修改应用程序状态的操作——您显然不希望应用程序具有不一致的状态!
如前所述,问题在于 uWSGI,而不是 NGINX。然而,你不能让 uWSGI 自动决定你的意图,而不是你自己向 uWSGI 透露这种意图。
您将如何在代码中准确表达您的意图?一大堆编程语言并不真正支持多线程和/或异步编程模型,这使得取消操作变得非常重要。
因此,这里没有神奇的解决方案。 即使像 Golang 这样的并发友好的编程语言也存在问题WithCancel context——你可能不得不在每个可能阻塞的函数调用中传递它,这使得代码非常难看。
您是否已经在 Django 中执行了上述上下文传递?如果不是,那么解决方案很丑但很简单——任何时候你可以明确地中止请求,检查客户端是否仍然连接到uwsgi.is_connected(uwsgi.connection_fd()):
| 归档时间: |
|
| 查看次数: |
3303 次 |
| 最近记录: |