我知道使用普通的线程网络服务器(例如 Apache)进行 AJAX 长轮询被认为是糟糕的设计……但我真的不明白为什么。
是不是因为每个长轮询请求比正常请求花费的时间要多得多(从而占用了处理器)?如果是这样的话,线程真的会占用那么多开销,以至于它们在使用前不能保持空闲一段时间吗?
我知道使用普通的线程网络服务器(例如 Apache)进行 AJAX 长轮询被认为是糟糕的设计……但我真的不明白为什么。
是不是因为每个长轮询请求比正常请求花费的时间要多得多(从而占用了处理器)?如果是这样的话,线程真的会占用那么多开销,以至于它们在使用前不能保持空闲一段时间吗?
澄清一下,AJAX 轮询是指客户端 javascript 发出未立即完成的 AJAX 请求。相反,服务器会一直等待,直到它想要向客户端推送回复,然后使用已经打开的 AJAX 上下文来执行此操作。(正确的?)
在处理每个连接的 Web 服务器上,它有自己的线程,打开的连接将导致为网站上的每个客户端创建一个线程。线程将一直运行,直到客户端关闭连接。当我说“正在运行”时,这只是意味着线程存在并且正在占用服务器资源;它可能在 sleep() 或 wait() 函数中空闲。但它仍然比基于事件的服务器消耗更多的系统资源。
不是你在占用处理器,而是你在阻塞线程池的一个连接和一个线程。然后必须为服务器配置一个更大的线程池。
如果您的应用程序试图与 facebook 竞争,那么您将面临一个重大问题,如果它是 SME 中用于订购午餐的内部应用程序,那么没有人会受到伤害。
这并不是一个简单的问题,因为它有多种因素会影响答案。
例如,您是否使用 yaws(用 Erlang 编写的网络服务器)?那么这真的不是问题,除了你在网络服务器上绑定端口,但线程不是问题。
您是否使用Java NewIO API,因此每个连接都不需要专用线程,那么线程就不会成为问题。
但是,如果你无谓地占用资源,不管你在做什么,那就不好了。例如,如果您保持数据库连接打开,进行一些主要处理,然后回写,这也是糟糕的设计。
仅在您需要时保留资源。
如果您要进行一些需要大量时间的处理,那么您可能需要查看更异步的解决方案。
例如,给用户一个唯一的号码,用户可以用它来检查他们的请求是否完成,这样他们就可以关闭他们的计算机,或者只是在他们想要的时候检查它,而不用担心丢失任何东西。