【问题标题】:Keep Elastic Load Balancer connection alive during long AJAX request在长 AJAX 请求期间保持 Elastic Load Balancer 连接处于活动状态
【发布时间】:2016-09-07 01:38:59
【问题描述】:

我遇到了这个问题:

  • 我正在使用 AJAX 向服务器发送一个请求,它在服务器端接收一些参数,并在服务器端生成一个 PDF。
  • 根据所使用的数据,生成 pdf 文件可能需要很长时间
  • AWS 的弹性负载均衡器在 60 秒的“空闲”连接后决定丢弃套接字,因此我的请求在这种情况下失败。

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

我了解解决问题的最佳方法是通过套接字发送数据以“告诉 ELB”我仍然处于活动状态。由于我们的体系结构和会话被锁定的事实,每 30 秒向服务器发送一个虚拟请求不起作用(即,我们不能有来自同一会话的并发 AJAX 请求,否则一个等待完成,直到另一个完成)

我尝试只对服务器上的文件发出 get 请求,但这并没有什么不同,我假设“套接字”是原始 AJAX 调用使用的那个。

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

TL;DR : 在 AJAX 请求挂起时,是否有任何优雅而有效的解决方案来保持套接字处于活动状态?

非常感谢,如果有人可以提供帮助,我在 SO 上发现了几个类似的问题,但都由“致电亚马逊团队要求他们增加设置中的超时”回答,这对我来说听起来很糟糕。

【问题讨论】:

  • 您真的需要在生成 pdf 的整个过程中保持会话锁定吗?
  • 好吧,我需要等待它返回 PDF。我知道我可以让它在后台运行,然后检查文件是否可用,但它也放在 S3 上,要使用我们的安全系统检索它,我需要生成文件的校验和,这意味着我可以'在生成完成之前,不要预测链接将是什么。
  • 不,我的意思是在继续构建 pdf 的同时发布会话,从而允许您定期发送 ajax 请求以保持请求处于活动状态,直到最终完成。
  • 对不起,我误读了你。但是会话是由 Zend 全局持有的,所以如果我释放它,那么在调用完成后,用户将无法在当前会话中继续使用该应用程序。
  • 我也不是这个意思。会话将保持活动状态,您将无法在给定的请求中再访问它。从会话中获取您需要的内容,发布它,然后生成 pdf。

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


【解决方案1】:

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

HTTP 504:网关超时

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

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

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

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

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

【讨论】:

  • 是的当然这是我开始的地方,我知道超时是什么,但是在负载均衡器设置上增加它并不是真正的解决方案,真正的解决方案是找到一种方法来保持一个特定的需要时连接仍然有效,这在 PHP 中显然是不可能的。
【解决方案2】:

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

  1. 第一个服务接受 HTTP 请求以生成 PDF 文档。此服务在请求被接受后立即结束。它会返回一个 UUID 或 URL 用于检查结果
  2. 第二个服务接受 UUID 并在 PDF 文档准备好时返回它。如果 PDF 文档没有准备好,此服务可以返回错误代码,例如 HTTP 404。

由于您使用 AJAX 调用服务器端,因此您可以轻松更改 javascript 并在第一个服务成功完成时调用第二个服务。这适用于您的方案吗?

【讨论】:

  • 是的,这是我必须采用的方法,问题是如果用户更改页面或离开,那么这有点丢失。理想情况下,像 Node 这样的语言将允许我使用 websockets 来发送通知。我认为最好的解决方案是在 PDF 完成后通过电子邮件将其发送给用户。我仍然会将您的答案标记为最佳答案,因为我认为没有更好的解决方法,而且负载均衡器不允许连接保持如此长时间是有充分理由的。
猜你喜欢
  • 1970-01-01
  • 2012-01-03
  • 2021-09-13
  • 2013-08-27
  • 2019-09-01
  • 1970-01-01
  • 2012-06-05
  • 2023-03-21
  • 1970-01-01
相关资源
最近更新 更多