设置:
我们有一个https://main.externaldomain/xmlservlet站点,该站点正在认证/验证/验证/geo-locating和proxy-ing和proxy-ing(稍微修改)请求(http://london044.internallomain/sternalnormain/xmlservlet)。P>
根本无法直接访问对最终用户的内部域。站点之间的通信偶尔会被中断,有时内部域的节点变得不可用/死亡。
主要站点是使用org.apache.http.impl.client.defaulthtpclient(我知道它已弃用,我们正在逐渐升级此旧版代码),并将ReadTimeOut设置为10.000毫米。请求和响应具有可变长度的XML有效载荷/主体,并且使用Transfer-Encoding: chunked
,也使用Keep-Alive: timeout=15
。
问题:
有时伦敦04实际上需要超过10秒(例如2分钟)才能执行。有时候,它无礼地崩溃。有时会发生其他(网络)问题。有时,在这2分钟内 - 响应-XML-DATA的部分逐渐填充,以至于部分之间没有10秒的差距,因此阅读时间永远不会超过,有时有10秒以上的差距和httpclient时间...
我们可以尝试增加主侧的超时,但这很容易膨胀/超载侦听器池(仅通过正常流量,甚至还没有被丢弃)。我们需要一种方法来区分内部站点 - 在生成响应中的响应和它真正崩溃/network_lost/etc的情况。最好的事情感觉是在交流过程中是某种心跳(每5秒)。
我们认为保留的活力可以拯救我们,但似乎仅在 之间确保差距 在期间不是),并且似乎没有这样做差距期间的任何令人心动的人(只有/等待暂停)。
我们认为,编码结构可以通过发送一些心跳(0 bytes sized-chunks)来挽救我们,以使其他方面意识到,但是似乎没有这样的/默认的以这种方式支持任何心跳,而且似乎没有那个bytes大小的块本身就是一个EOD指示器...
问题:
如果我们的假设是正确的,那就是keepalive/bunkedenCoding并不能帮助我们实现守护/hearbeat/fastdetectionofdeadbackend:
1)应该在哪个层中实现哪个层?http?TCP?
2)是否已经实现了任何标准框架/库/设置/等?(如果可能的话:Java,休息)
update
我还研究了WADL/WSDL的心跳进化器,尽管没有找到休息,但还是检查了Websockets ...还研究了TCP-保存剂,这似乎是任务的正确费用:
- https://en.wikipedia.org/wiki/keepalive
- http://tldp.org/howto/tcp-keepalive-howto/usingekepalive.html
- 插座心跳与keepalive
- websockets ping/pong,为什么不tcp keetalive?
但是,根据这些内容,我必须设置类似:
之类的东西- tcp_keepalive_time = 5
- tcp_keepalive_intvl = 1
- tcp_keepalive_probes = 3
似乎是反对的反对(推荐的2H,已经以10分钟为奇数出现的是5S的/安全?>
我还应该在哪里配置这个?在伦敦04上,也单独还是在主要上?(如果我将其设置在Main上 - 它不会淹没客户端 ->主要前端通信吗?或者网站之间的NAT/ETC会毁了库存意图/支持吗?)
P.S。欢迎与RTFM的任何链接 - 我可能只是缺少明显的东西:)
我的建议是不使用心跳。让您的外部面向API返回带有指示标题的303 See Other
,该标头指示可能可用的何时何地。
,您可以致电:
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
,总共需要两分钟。
或者,使用旨在长时间保持开放的协议,例如WebSocket。
看一下SSE
示例代码:https://github.com/rsvoboda/resteasy-sse
或VERTX事件总线:https://vertx.io/docs/apidocs/io/vertx/core/eventbus/eventbus.html