我们在Symfony2中使用AngularJS构建了一个应用程序。随着用户数量的增加,应用程序的性能正在下降。
应用程序网页需要不断更新;除此之外,还有一些模态,需要更新。目前,我依赖于常规的Ajax请求。为了使页面保持最新,我每2秒钟发送2个Ajax请求。每当用户调出一个模态时,应用程序就会停止更新页面,发送一个Ajax请求来获取模态的数据,然后每2秒连续发送一个Ajax请求来更新该模态。用户关闭后,modal应用程序将恢复Ajax对页面的请求。
由于这种场景复制到100个工作站;服务器变得繁忙,Ajax请求需要更长的时间才能完成。通常Ajax对modals的请求大约需要1秒,但一旦服务器繁忙,请求需要2到3秒,这对用户来说是相当大的延迟。
在谷歌上搜索了很长时间后,我发现了一些解决方案,但不确定哪种解决方案是最好的,因为我无法尝试和测试它们中的每一种:
我的第一个解决方案包括长轮询保留定期Ajax请求以更新页面,并使用长轮询更新模式,因为它们不会频繁更改。不利的一面是,来自第一个客户端的长时间轮询将使服务器繁忙,这将导致其他客户端的延迟。除了延迟之外,服务器将很难检测到取消/中止的长轮询。
Web套接字web套接字似乎是一个很好的竞争者,但Apache不支持它。对于这个问题,我可以使用Ratchet,但IE-9默认不支持。很少有聚乙烯填充物;但是请求仍然在队列中处理。因此,重复使用连接节省的时间不会产生积极影响。
服务器发送事件我们已经将其用于另一个应用程序。它也可以重用连接,但服务器将很难检测到应用程序关闭;此外,该服务器将保持繁忙,并且可能需要更长的时间来处理多个客户端连接。
多线程PHP现在能够运行多个线程。我可以为每个Ajax请求创建一个线程,但这种设置会创建大量线程,因为PHP不擅长垃圾收集,这可能会导致内存泄漏。
我还考虑将长轮询和多线程或服务器发送事件和多线程相结合。
我们的环境有一些限制,例如
- 我们必须支持所有的浏览器,但IE-9就是其中之一
- 工作站的范围从瘦客户端到PC再到虚拟桌面
- 用户数量在一天中波动
- 此外,我们使用的Angular应用程序实际上并不是一个单页应用程序
- 应用程序已启动并在智能屏幕上持续运行
- 我们希望为模态加载数据,这样用户就不会等待模态出现
我相信我已经考虑了所有可能的解决方案。如果我错过了,请告诉我。
欢迎所有建议
我不确定你的问题在哪里,但如果你使用ajax不断更新每个2s,那么你可能在一个时间内有来自一个客户端的许多请求,所以你的服务器很难处理。我更喜欢不每2秒发出请求,但在响应(成功与否)后,添加另一个等待时间为2秒的请求,所以你会发出请求链,并且只有一个来自一个客户端的请求。下一个问题是在ur服务器上的性能,因为1-3s的响应时间很长,在prod-env上运行,请参阅profiler,看看是什么花了这么长时间,可能使用trick,用于json请求等…