什么是重试失败的代理请求的正确方法

时间:2015-10-14 12:34:52

标签: proxy jetty

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

我假设我需要覆盖AbstractProxyServlet的a=100 b=["abc","def"] print [(i,a) for i in b] 方法并实现我自己的错误处理,但我不确定如何创建和发送新的代理请求并将其与来自客户端的原始请求相关联。 / p>

1 个答案:

答案 0 :(得分:2)

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

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

如果一个失败,两个都会自动失败。 由于浏览器HTTP交换已经提交并部分完成,因此很难重试。

实质上,需要暂停浏览器HTTP交换,然后需要从头开始重新启动代理HTTP交换,然后你需要赶上"赶上"代理端的交换到您在浏览器端的点。一旦陷入困境,您将不得不调整代理响应以匹配浏览器响应的技术(如已知内容长度,gzip状态,分块等等)。

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

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