2

我知道使用普通的线程网络服务器(例如 Apache)进行 AJAX 长轮询被认为是糟糕的设计……但我真的不明白为什么。

是不是因为每个长轮询请求比正常请求花费的时间要多得多(从而占用了处理器)?如果是这样的话,线程真的会占用那么多开销,以至于它们在使用前不能保持空闲一段时间吗?

4

3 回答 3

7

澄清一下,AJAX 轮询是指客户端 javascript 发出未立即完成的 AJAX 请求。相反,服务器会一直等待,直到它想要向客户端推送回复,然后使用已经打开的 AJAX 上下文来执行此操作。(正确的?)

在处理每个连接的 Web 服务器上,它有自己的线程,打开的连接将导致为网站上的每个客户端创建一个线程。线程将一直运行,直到客户端关闭连接。当我说“正在运行”时,这只是意味着线程存在并且正在占用服务器资源;它可能在 sleep() 或 wait() 函数中空闲。但它仍然比基于事件的服务器消耗更多的系统资源。

于 2010-06-25T21:08:32.603 回答
1

不是你在占用处理器,而是你在阻塞线程池的一个连接和一个线程。然后必须为服务器配置一个更大的线程池。

如果您的应用程序试图与 facebook 竞争,那么您将面临一个重大问题,如果它是 SME 中用于订购午餐的内部应用程序,那么没有人会受到伤害。

于 2010-06-25T21:08:52.210 回答
0

这并不是一个简单的问题,因为它有多种因素会影响答案。

例如,您是否使用 yaws(用 Erlang 编写的网络服务器)?那么这真的不是问题,除了你在网络服务器上绑定端口,但线程不是问题。

您是否使用Java NewIO API,因此每个连接都不需要专用线程,那么线程就不会成为问题。

但是,如果你无谓地占用资源,不管你在做什么,那就不好了。例如,如果您保持数据库连接打开,进行一些主要处理,然后回写,这也是糟糕的设计。

仅在您需要时保留资源。

如果您要进行一些需要大量时间的处理,那么您可能需要查看更异步的解决方案。

例如,给用户一个唯一的号码,用户可以用它来检查他们的请求是否完成,这样他们就可以关闭他们的计算机,或者只是在他们想要的时候检查它,而不用担心丢失任何东西。

于 2010-06-25T21:16:55.607 回答