在长期AJAX请求期间保持Elastic Load Balancer连接处于活动状态

时间:2016-05-11 14:52:08

标签: php ajax amazon-web-services amazon-elb

我遇到了这个问题:

  • 我正在使用AJAX向服务器发送请求,其中服务器端和服务器端的一些参数将生成PDF。
  • 根据所使用的数据,pdf的生成可能需要很长时间
  • AWS的Elastic Load Balancer,经过60秒的“空闲”连接后决定放弃套接字,因此我的请求在这种情况下失败。

我知道可以在ELB设置中增加超时,但不仅我的系统管理员反对它,它也是一个错误的解决方案,也是不好的做法。

我知道解决问题的最佳方法是通过套接字发送数据,以“告诉ELB”我仍然活跃。由于我们的体系结构以及会话被锁定的事实(即,我们不能从同一会话中获得并发的AJAX请求,否则一个待处理直到另一个完成),每30秒向服务器发送一个虚拟请求不起作用< / p>

我尝试对服务器上的文件执行get请求,但它没有什么区别,我认为“socket”是原始AJAX调用使用的那个。

服务器上的功能非常线性,几乎不可能在多个调用中分开,让它在后台运行并每隔5秒检查一次,直到完成为止让我在资源控制方面感到不舒服。

TL; DR:在AJAX请求待处理时,是否有任何优雅而有效的解决方案来维持套接字活动?

非常感谢,如果有人可以帮忙解决这个问题,我在SO上发现了几个类似的问题,但两者都是通过“致电亚马逊团队要求他们增加设置中的超时”来回答的,这对我来说非常糟糕。< / p>

2 个答案:

答案 0 :(得分:0)

另一种方法是将整个操作划分为两个服务:

  1. 第一个服务接受用于生成PDF文档的HTTP请求。接受请求后,此服务立即完成。它将返回用于检查结果的UUID或URL
  2. 第二个服务接受UUID并返回PDF文档(如果已准备好)。如果PDF文档尚未就绪,则此服务可以返回错误代码,例如HTTP 404。
  3. 由于您使用AJAX来呼叫服务器端,因此当第一个服务成功完成时,您可以轻松更改javascript并调用第二个服务。这适用于您的场景吗?

答案 1 :(得分:-1)

您是否尝试过关注trouble shooting guide of ELB?引用下面的相关部分:

  

HTTP 504:网关超时

     

描述:表示负载均衡器关闭了连接   因为请求未在空闲超时期限内完成。

     

原因1:应用程序响应时间比配置时间长   空闲超时。

     

解决方案1:监控HTTPCode_ELB_5XX和延迟指标。如果有   是这些指标的增加,可能是由于应用程序   在空闲超时期限内没有响应。有关的详细信息   超时请求,启用负载均衡器上的访问日志   并查看由生成的日志中的504响应代码   弹性负载平衡。如有必要,您可以增加容量   或者增加配置的空闲超时以便进行冗长的操作   (例如上传大文件)可以完成。

     

原因2:已注册的实例关闭与Elastic Load的连接   平衡。

     

解决方案2:在EC2实例上启用保持活动设置并进行设置   保持活动超时大于或等于空闲超时   负载均衡器的设置。