2

设置:

我们有一个https://Main.externaldomain/xmlservlet站点,例如,它正在验证/验证/地理定位和代理(稍作修改)对http://London04.internaldomain/xmlservlet的请求。

根本无法直接访问暴露给最终用户的内部域。站点之间的通信偶尔会中断,有时内部域节点变得不可用/死机。

主站点使用 org.apache.http.impl.client.DefaultHttpClient(我知道它已被弃用,我们正在逐步升级此遗留代码),并将 readTimeout 设置为 10.000 毫秒。请求和响应具有可变长度的 xml 有效负载/正文,并且Transfer-Encoding: chunked使用了,也Keep-Alive: timeout=15使用了。

问题:

有时 London04 实际上需要超过 10 秒(比如说 2 分钟)来执行。有时它会不优雅地崩溃。有时会发生其他(网络)问题。有时在这 2 分钟内 - response-xml-data 的部分被逐渐填充,部分之间没有 10 秒的间隙,因此 readTimeout 永远不会超过,有时会有 10+ 秒的间隙并且 HttpClient 超时...

我们可以尝试增加 Main 端的超时,但这很容易使侦听器池膨胀/过载(仅通过常规流量,甚至还没有被 DDOS)。我们需要一种方法来区分 internal-site-still-working-on-generating-the-response 和它真正崩溃/network_lost/等的情况。最好的感觉是交流过程中的某种心跳(每 5 秒)。

我们认为 Keep-Alive 会拯救我们,但它似乎只保护请求之间的间隙(而不是请求期间),并且在间隙期间似乎没有做任何心跳(只是有/waiting_for 超时)。

我们认为分块编码可以通过发送一些心跳(0-bytes-sized-chunks)让对方知道来拯救我们,但似乎没有这样/默认的实现以这种方式支持任何心跳,而且似乎 0-字节大小的块本身就是一个 EOD 指标......

问题):

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

1)应该在哪一层实现这样的心跳?网址?tcp?

2)任何标准框架/库/设置/等已经实现了吗?(如果可能:Java、REST)


更新

我还研究了 WADL/WSDL 的心跳实现器,虽然没有找到 REST,但检查了 WebSockets... 还研究了 TCP-keepalives,这似乎是该任务的正确功能:

但根据那些我必须设置类似的东西:

  • tcp_keepalive_time=5
  • tcp_keepalive_intvl=1
  • tcp_keepalive_probes=3

这似乎是一个反建议(建议 2 小时,10 分钟已经作为一个奇数呈现,5 秒理智/安全??如果是 - 可能是我的预先解决方案......)

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

PS 欢迎任何指向 RTFM 的链接 - 我可能只是遗漏了一些明显的东西 :)

4

2 回答 2

3

我的建议是不要使用心跳。让您的面向外部的 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,总共需要两分钟。

或者,使用旨在长时间保持打开状态的协议,例如WebSockets

于 2019-02-26T15:48:52.467 回答
1

看看SSE

示例代码: https ://github.com/rsvoboda/resteasy-sse

或 vertx 事件总线: https ://vertx.io/docs/apidocs/io/vertx/core/eventbus/EventBus.html

于 2019-02-26T16:10:48.350 回答