Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';Java REST的心跳/保持活动技术/层是什么?Http?Tcp?编码:分块?_Java_Rest_Keep Alive_Heartbeat_Tcp Keepalive - Fatal编程技术网

什么';Java REST的心跳/保持活动技术/层是什么?Http?Tcp?编码:分块?

什么';Java REST的心跳/保持活动技术/层是什么?Http?Tcp?编码:分块?,java,rest,keep-alive,heartbeat,tcp-keepalive,Java,Rest,Keep Alive,Heartbeat,Tcp Keepalive,设置: 我们有一个站点,它正在对请求进行身份验证/验证/地理定位和代理(稍微修改) 最终用户根本无法直接访问internaldomain。站点之间的通信偶尔会中断,有时internaldomain节点变得不可用/失效 主站点正在使用org.apache.http.impl.client.DefaultHttpClient(我知道它已被弃用,我们正在逐步升级这段遗留代码),readTimeout设置为10.000毫秒。 请求和响应具有可变长度的xml有效负载/正文,并且使用传输编码:chunked

设置:

我们有一个站点,它正在对请求进行身份验证/验证/地理定位和代理(稍微修改)

最终用户根本无法直接访问internaldomain。站点之间的通信偶尔会中断,有时internaldomain节点变得不可用/失效

主站点正在使用org.apache.http.impl.client.DefaultHttpClient(我知道它已被弃用,我们正在逐步升级这段遗留代码),readTimeout设置为10.000毫秒。 请求和响应具有可变长度的xml有效负载/正文,并且使用
传输编码:chunked
,还使用
保持活动:超时=15

问题:

有时候,London04实际上需要超过10秒(比方说2分钟)才能执行。有时它会不优雅地崩溃。有时会发生其他(网络)问题。 有时,在这2分钟内,响应xml数据的各个部分被逐渐填满,以至于各个部分之间没有10秒的间隔,因此读取超时时间永远不会超过, 有时会出现10秒以上的间隔,HttpClient超时

我们可以尝试增加主机端的超时,但这很容易使侦听器池膨胀/过载(仅通过常规流量,甚至还没有被DDoS攻击)。 我们需要一种方法来区分仍在生成响应的内部站点和它真正崩溃/网络丢失/等等的情况。 在交流过程中,最好的感觉是心跳(每5秒一次)

我们认为Keep-Alive可以拯救我们,但它似乎只保护请求之间的间隔(而不是在请求期间),并且在间隔期间似乎没有任何心跳(只是等待超时)

我们认为分块编码可以通过发送一些心跳信号(0字节大小的分块)让另一方知道来节省我们的时间,但似乎没有这样的/默认实现以这种方式支持任何心跳信号,而且似乎0字节大小的分块本身就是一个EOD指示器

问题:

如果我们正确地假设KeepAlive/ChunkedEncoding不会帮助我们实现keptAlive/hearbeat/fastDetectionOfDeadBackend,那么:

1) 这种心跳应该在哪一层实施?Http?tcp

2) 是否已经有任何标准框架/库/设置/等实现了它?(如果可能:Java,REST)


更新

我还研究了WADL/WSDL的心跳实现程序,尽管在REST中没有发现,但我查看了WebSocket。。。 还研究了TCP keepalives,这似乎是任务的正确选择:

但根据这些,我必须设置如下内容:

  • tcp_keepalive_time=5
  • tcp_keepalive_intvl=1
  • tcp_keepalive_探测器=3
这似乎是一个反建议(建议2小时,10分钟已经作为奇数值显示,将变为5秒正常/安全??如果是-可能是我的解决方案提前…)

我应该在哪里配置它?单独在伦敦还是在梅因?(如果我将其设置在Main上,它不会淹没客户端-->主前端通信吗?或者站点之间的NAT/etc会轻易破坏keepalive意图/支持吗?)


另外,任何指向RTFM的链接都是受欢迎的-我可能只是错过了一些明显的东西:)

我的建议是不要使用心跳。让您的面向外部的API返回一个
303请参阅其他
,其标题指示所需响应何时何地可用

所以你可以打电话:

POST https://public.api/my/call
回来

303 See Other
Location: "https://public.api/my/call/results"
Retry-After: 10
您的服务器可以猜测生成响应需要多长时间,因此应该将其考虑到
Retry After
值中。如果对新位置进行了稍后的
GET
调用,并且尚未生成结果,则返回一个带有更新的
Retry After
值的响应。因此,您可能尝试
10
,如果这不起作用,您会告诉客户机再等待一次
110
,总共两分钟

或者,使用设计为长时间保持开放的协议,例如

看一看

示例代码:

或vertx事件总线:

From:为链接提供上下文鼓励使用指向外部资源的链接,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及它为什么存在。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久脱机。javax.ws.rs.sse看起来是一个非常可行的选项(除了心跳必须由服务器端驱动,而不是让客户端使用“我还在这里”心跳响应)-谢谢,将继续投票。虽然我不认为EventBus是相关的。@Vlad现在看一看,我明白了您对EventBus的意思(看到他们的over-http通信协议的tcpdump会很有趣),但遗憾的是,vertx的所有功能都要求它启动一个独立的服务/侦听器(与现有的webapp容器分离)。我已经找到了一个通过Tomcat容器代理/桥接它的工作选项,但是这个选项似乎通过在vertx通信之上预缓冲/etc开销来影响vertx特性:我将坚持WebSockets答案,因为现有代码很容易切换到它,thx!轮询并不是一个好的解决方案(尤其是在响应缓冲的RAM开销和重试后的不可预测性的情况下)。我们研究了WebSocket(参见问题),但在您将其作为一个选项提出后—找到了一些很好的客户端和服务器部分的默认(spring)实现,这些实现可能与我们的代码非常兼容(只有传输正在更改)—将尝试一下,谢谢!Acce