使用Comet(长轮询)时,uwsgi进程会卡住吗?

4
我认为nginx是基于事件的,因此使用一个单一的worker可以处理多个请求,例如100个请求/秒。然后这些请求将被传递给uwsgi进行处理,一旦完成处理,它将把结果返回给nginx,然后nginx将把结果推送给发起http请求的用户。
假设我只为我的uwsgi使用了一个worker(没有线程),那么uwsgi会逐个处理这100个请求,对吗?所以它需要进行100个进程来完成所有请求。 如果我计划使用长轮询来快速更新我的前端, Facebook、Gmail如何发送实时通知? 我认为它将强制uwsgi处理单个请求(即长轮询过程)并暂停所有其他请求,从而导致整个系统崩溃。
我是否对uwsgi的工作方式有什么误解,或者是否有任何其他解决方案来实现长轮询?
谢谢您。

1
这是一个有趣的问题,但标题不太好。改成这个怎么样,以吸引那些能够提供帮助的人:“使用Comet时,uwsgi进程是否保持空闲状态?”也许还可以在标签中添加“comet”。请注意,这个问题可能更适合发布在http://serverfault.com/上。 - Antonis Christofides
1个回答

1
您的分析是正确的,长轮询不适合多进程或多线程模式(从成本角度考虑)。每个进程/线程只能处理一个请求。幸运的是,uWSGI支持数十种非阻塞/事件/微线程技术(如gevent或较低级别的greenlets),如果您的应用程序可以适应这些模式(这不是一项简单的任务,因此不要指望猴子补丁就足够了),您将会获胜。
此外,如果您喜欢/容忍基于回调的编程,并且您不需要uWSGI特定的功能,我认为Tornado是解决问题的绝佳选择。

我明白了,您建议直接运行Tornado还是在nginx后面运行Tornado? 我目前发现的是http://www.quora.com/Tornado-web-framework/If-Tornado-has-to-be-backed-up-by-Apache-or-nginx-why-does-it-have-a-web-server 你同意吗?谢谢 - Angky William
作为一般规则,永远不要直接将应用服务器暴露在公共网络中。所以,是的,我同意这篇文章。 - roberto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接