【问题标题】:With mod_jk, tomcat, and jersey, how do you keep a long running request alive?使用 mod_jk、tomcat 和 jersey,如何保持长时间运行的请求有效?
【发布时间】:2014-04-07 20:50:15
【问题描述】:

在客户端,我们使用 HttpClient 进行通信。在服务器端,我们使用 Jersey 和 tomcat。

我们的请求如下所示

客户端 -> 负载平衡器 -> 服务器

问题是这样的,客户端会向服务器发出请求;该请求溢出 mod_jk 的 180 秒超时,导致负载均衡器终止连接。我需要的是某种方式向 mod_jk 发出信号,表明“是的,此连接处于活动状态且正在进行中”,这样它就不会终止连接。或者,如果我们可以向 mod_jk 发出“此请求可能需要很长时间”的信号,那就太好了。

我们现在在负载均衡器中不是很好的解决方案,我们将 socket_timeout 提高到 20 分钟。更好的解决方案是让服务器发出它仍在工作的信号。最好的解决方案是让请求运行得更快(最多 12 分钟)。

我怎样才能让服务器发出它仍在前进的信号?不幸的是,发送部分数据对我们来说并不是很有效,因为这个请求是为了获取一个昂贵且大的对象,而该对象实际上是不可流式传输的。

【问题讨论】:

  • 告诉负载均衡器它不应该超时是一回事,你如何将它传达给首先发起请求的客户端/用户?
  • 在客户端有一个“加载栏”。在它旁边,我们有一个加载状态,让他们知道正在加载什么。客户端是一个摇摆应用程序。我应该注意到负载平衡器是新的方程。在我们所有的客户都访问一台服务器之前(一切正常)。

标签: java tomcat jersey httpclient


【解决方案1】:

Tomcat 对响应输出流有不同的实现。

不同的行为是由连接负载平衡器和 Tomcat 的 AJP 连接器引起的(只是猜测您使用 AJP)。使用独立的 Tomcat 可以写入响应输出流并且内容是缓冲。当您写入由 AJP 连接器支持的响应输出流时,内容会立即刷新。这是有道理的,因为如果没有从 Tomcat 传递到负载均衡器的恒定数据流,它将在将其视为超时后“挂起”。

所以,我建议你在准备真正的响应负载时,找到一些连续或定期发送“一些数据”的方法。

【讨论】:

  • 感谢您的帮助。我希望有办法绕过管道发送垃圾消息,但事实就是这样。
猜你喜欢
  • 2021-08-20
  • 2019-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-31
  • 2011-01-12
  • 2012-02-16
  • 2011-01-23
相关资源
最近更新 更多