【问题标题】:What's the right way to retry a proxy request that failed重试失败的代理请求的正确方法是什么
【发布时间】:2015-10-14 12:34:51
【问题描述】:

我有一个使用 Jetty 的 AsyncProxyServlet.Transparent (Jetty 9) 实现的代理 servlet。由于远程服务器有时会关闭连接的方式,代理请求有时会因 EarlyEOF 异常而失败。在这些情况下,我希望代理代表客户端重试请求,而不是返回 502 状态响应。这样做的正确方法是什么?

我假设我需要重写 AbstractProxyServlet 的 onProxyResponseFailure 方法并实现我自己的错误处理,但我不确定如何创建和发送新的代理请求并将其与来自客户端的原始请求相关联。

【问题讨论】:

    标签: proxy jetty


    【解决方案1】:

    使用 AsyncProxyServlet 进行代理重试是不可行的。

    浏览器 HTTP 交换和代理 HTTP 交换的异步特性意味着它们彼此紧密相连。

    如果一个失败,两个都失败,自动。 重试非常困难,因为浏览器 HTTP 交换已经提交并部分完成。

    本质上,浏览器 HTTP 交换需要暂停,然后代理 HTTP 交换需要重新启动,从头开始,然后您需要“赶上”代理端的交换。您在浏览器端的位置。一旦赶上,您将不得不调整代理响应以匹配浏览器响应的技术(例如已知的内容长度、gzip 状态、分块等。)

    如果代理响应在请求之间发生变化,即使是很小的变化(响应标头、大小、压缩、内容等),这也会变得更加复杂。

    您可以完成重试的唯一方法是不使用异步,而是在将响应发送到客户端之前使用代理响应的完全缓存(但这实际上比异步代理技术更难实现,因为您有处理复杂的内存、http 缓存和超时问​​题)

    【讨论】:

    • 不完全是我所希望的答案,但感谢您省去了我自己尝试解决这个问题的麻烦。
    猜你喜欢
    • 2014-09-23
    • 2012-04-18
    • 2014-08-18
    • 2013-08-23
    • 2017-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多