在长 AJAX 请求期间保持 Elastic Load Balancer 连接处于活动状态
Keep Elastic Load Balancer connection alive during long AJAX request
我运行正在解决这个问题:
- 我正在使用 AJAX 向服务器发送请求,它在服务器端接收一些参数并在服务器端生成 PDF。
- 生成 pdf 可能需要很长时间,具体取决于所使用的数据
- AWS 的弹性负载均衡器,在 "idle" 连接 60 秒后决定丢弃套接字,因此在这种情况下我的请求失败了。
我知道可以在 ELB 设置中增加超时时间,但不仅我的系统管理员反对,这也是一个错误的解决方案和不良做法。
我知道解决问题的最佳方法是通过套接字发送数据到 "tell ELB" 我仍然处于活动状态的排序。由于我们的架构和会话被锁定的事实,每 30 秒向服务器发送一个虚拟请求是行不通的(即,我们不能有来自同一会话的并发 AJAX 请求,否则一个将等待另一个一个完成)
我只是尝试对服务器上的文件发出获取请求,但这没有什么不同,我假设 "socket" 是原始 AJAX 调用使用的请求。
服务器上的功能非常线性,几乎不可能分成多个调用,让它 运行 在后台并每 5 秒检查一次直到完成的想法让我感到不舒服资源控制。
TL;DR:在 AJAX 请求挂起时,是否有任何优雅有效的解决方案来保持套接字处于活动状态?
非常感谢,如果有人可以帮助解决这个问题,我在 SO 上发现了几个类似的问题,但是 "call amazon team to ask them to increase the timeout in your settings" 回答了这两个问题,这对我来说听起来很糟糕。
您是否尝试过关注trouble shooting guide of ELB?引用以下相关部分:
HTTP 504: Gateway Timeout
Description: Indicates that the load balancer closed a connection
because a request did not complete within the idle timeout period.
Cause 1: The application takes longer to respond than the configured
idle timeout.
Solution 1: Monitor the HTTPCode_ELB_5XX and Latency metrics. If there
is an increase in these metrics, it could be due to the application
not responding within the idle timeout period. For details about the
requests that are timing out, enable access logs on the load balancer
and review the 504 response codes in the logs that are generated by
Elastic Load Balancing. If necessary, you can increase your capacity
or increase the configured idle timeout so that lengthy operations
(such as uploading a large file) can complete.
Cause 2: Registered instances closing the connection to Elastic Load
Balancing.
Solution 2: Enable keep-alive settings on your EC2 instances and set
the keep-alive timeout to greater than or equal to the idle timeout
settings of your load balancer.
另一种方法是将整个操作分为两个服务:
- 第一个服务接受生成 PDF 文档的 HTTP 请求。该服务在请求被接受后立即结束。它将return一个UUID或URL用于检查结果
- 第二个服务接受 UUID 和 return PDF 文档(如果准备就绪)。如果 PDF 文档未准备好,此服务可以 return 错误代码,例如 HTTP 404。
由于您正在使用 AJAX 调用服务器端,因此您可以轻松更改 javascript 并在第一个服务成功完成时调用第二个服务。这适用于您的场景吗?
我运行正在解决这个问题:
- 我正在使用 AJAX 向服务器发送请求,它在服务器端接收一些参数并在服务器端生成 PDF。
- 生成 pdf 可能需要很长时间,具体取决于所使用的数据
- AWS 的弹性负载均衡器,在 "idle" 连接 60 秒后决定丢弃套接字,因此在这种情况下我的请求失败了。
我知道可以在 ELB 设置中增加超时时间,但不仅我的系统管理员反对,这也是一个错误的解决方案和不良做法。
我知道解决问题的最佳方法是通过套接字发送数据到 "tell ELB" 我仍然处于活动状态的排序。由于我们的架构和会话被锁定的事实,每 30 秒向服务器发送一个虚拟请求是行不通的(即,我们不能有来自同一会话的并发 AJAX 请求,否则一个将等待另一个一个完成)
我只是尝试对服务器上的文件发出获取请求,但这没有什么不同,我假设 "socket" 是原始 AJAX 调用使用的请求。
服务器上的功能非常线性,几乎不可能分成多个调用,让它 运行 在后台并每 5 秒检查一次直到完成的想法让我感到不舒服资源控制。
TL;DR:在 AJAX 请求挂起时,是否有任何优雅有效的解决方案来保持套接字处于活动状态?
非常感谢,如果有人可以帮助解决这个问题,我在 SO 上发现了几个类似的问题,但是 "call amazon team to ask them to increase the timeout in your settings" 回答了这两个问题,这对我来说听起来很糟糕。
您是否尝试过关注trouble shooting guide of ELB?引用以下相关部分:
HTTP 504: Gateway Timeout
Description: Indicates that the load balancer closed a connection because a request did not complete within the idle timeout period.
Cause 1: The application takes longer to respond than the configured idle timeout.
Solution 1: Monitor the HTTPCode_ELB_5XX and Latency metrics. If there is an increase in these metrics, it could be due to the application not responding within the idle timeout period. For details about the requests that are timing out, enable access logs on the load balancer and review the 504 response codes in the logs that are generated by Elastic Load Balancing. If necessary, you can increase your capacity or increase the configured idle timeout so that lengthy operations (such as uploading a large file) can complete.
Cause 2: Registered instances closing the connection to Elastic Load Balancing.
Solution 2: Enable keep-alive settings on your EC2 instances and set the keep-alive timeout to greater than or equal to the idle timeout settings of your load balancer.
另一种方法是将整个操作分为两个服务:
- 第一个服务接受生成 PDF 文档的 HTTP 请求。该服务在请求被接受后立即结束。它将return一个UUID或URL用于检查结果
- 第二个服务接受 UUID 和 return PDF 文档(如果准备就绪)。如果 PDF 文档未准备好,此服务可以 return 错误代码,例如 HTTP 404。
由于您正在使用 AJAX 调用服务器端,因此您可以轻松更改 javascript 并在第一个服务成功完成时调用第二个服务。这适用于您的场景吗?