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