使用Backoff策略提高HttpClient連接管理的效率
序
本文主要研究一下HttpClient的ConnectionBackoffStrategy
ConnectionBackoffStrategy
org/apache/http/client/ConnectionBackoffStrategy.java
/** * When managing a dynamic number of connections for a given route, this * strategy assesses whether a given request execution outcome should * result in a backoff signal or not, based on either examining the * {@code Throwable} that resulted or by examining the resulting * response (e.g. for its status code). * * @since 4.2 * */ public interface ConnectionBackoffStrategy { /** * Determines whether seeing the given {@code Throwable} as * a result of request execution should result in a backoff * signal. * @param t the {@code Throwable} that happened * @return {@code true} if a backoff signal should be * given */ boolean shouldBackoff(Throwable t); /** * Determines whether receiving the given {@link HttpResponse} as * a result of request execution should result in a backoff * signal. Implementations MUST restrict themselves to examining * the response header and MUST NOT consume any of the response * body, if any. * @param resp the {@code HttpResponse} that was received * @return {@code true} if a backoff signal should be * given */ boolean shouldBackoff(HttpResponse resp); }
ConnectionBackoffStrategy定義了shouldBackoff方法,它根據(jù)異常或者response來(lái)進(jìn)行判斷
NullBackoffStrategy
org/apache/http/impl/client/NullBackoffStrategy.java
public class NullBackoffStrategy implements ConnectionBackoffStrategy { @Override public boolean shouldBackoff(final Throwable t) { return false; } @Override public boolean shouldBackoff(final HttpResponse resp) { return false; } }
NullBackoffStrategy實(shí)現(xiàn)了ConnectionBackoffStrategy,shouldBackoff方法返回false
DefaultBackoffStrategy
org/apache/http/impl/client/DefaultBackoffStrategy.java
public class DefaultBackoffStrategy implements ConnectionBackoffStrategy { @Override public boolean shouldBackoff(final Throwable t) { return t instanceof SocketTimeoutException || t instanceof ConnectException; } @Override public boolean shouldBackoff(final HttpResponse resp) { return resp.getStatusLine().getStatusCode() == 429 || resp.getStatusLine().getStatusCode() == HttpStatus.SC_SERVICE_UNAVAILABLE; } }
DefaultBackoffStrategy在SocketTimeoutException或者ConnectException的時(shí)候返回true,或者在response code為429或者503的時(shí)候返回true
BackoffStrategyExec
org/apache/http/impl/execchain/BackoffStrategyExec.java
@Contract(threading = ThreadingBehavior.IMMUTABLE_CONDITIONAL) public class BackoffStrategyExec implements ClientExecChain { private final ClientExecChain requestExecutor; private final ConnectionBackoffStrategy connectionBackoffStrategy; private final BackoffManager backoffManager; public BackoffStrategyExec( final ClientExecChain requestExecutor, final ConnectionBackoffStrategy connectionBackoffStrategy, final BackoffManager backoffManager) { super(); Args.notNull(requestExecutor, "HTTP client request executor"); Args.notNull(connectionBackoffStrategy, "Connection backoff strategy"); Args.notNull(backoffManager, "Backoff manager"); this.requestExecutor = requestExecutor; this.connectionBackoffStrategy = connectionBackoffStrategy; this.backoffManager = backoffManager; } @Override public CloseableHttpResponse execute( final HttpRoute route, final HttpRequestWrapper request, final HttpClientContext context, final HttpExecutionAware execAware) throws IOException, HttpException { Args.notNull(route, "HTTP route"); Args.notNull(request, "HTTP request"); Args.notNull(context, "HTTP context"); CloseableHttpResponse out = null; try { out = this.requestExecutor.execute(route, request, context, execAware); } catch (final Exception ex) { if (out != null) { out.close(); } if (this.connectionBackoffStrategy.shouldBackoff(ex)) { this.backoffManager.backOff(route); } if (ex instanceof RuntimeException) { throw (RuntimeException) ex; } if (ex instanceof HttpException) { throw (HttpException) ex; } if (ex instanceof IOException) { throw (IOException) ex; } throw new UndeclaredThrowableException(ex); } if (this.connectionBackoffStrategy.shouldBackoff(out)) { this.backoffManager.backOff(route); } else { this.backoffManager.probe(route); } return out; } }
BackoffStrategyExec實(shí)現(xiàn)了ClientExecChain接口,其execute執(zhí)行requestExecutor.execute,捕獲到異常的時(shí)候通過(guò)connectionBackoffStrategy.shouldBackoff(ex)來(lái)決定是否需要backOff,是的話執(zhí)行backoffManager.backOff(route);
若沒(méi)有異常則通過(guò)connectionBackoffStrategy.shouldBackoff(out)根據(jù)response來(lái)判斷是否需要backOff,是的化執(zhí)行backoffManager.backOff(route)
小結(jié)
HttpClient的DefaultBackoffStrategy在SocketTimeoutException或者ConnectException的時(shí)候返回true,或者在response code為429或者503的時(shí)候返回true;BackoffStrategyExec則通過(guò)connectionBackoffStrategy與backoffManager來(lái)配合執(zhí)行backOff。這個(gè)backOff的目的就是動(dòng)態(tài)調(diào)整每個(gè)route的connection大小(MaxPerRoute
)。
以上就是使用Backoff策略提高HttpClient連接管理的效率的詳細(xì)內(nèi)容,更多關(guān)于HttpClient Backoff連接管理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 解讀httpclient的validateAfterInactivity連接池狀態(tài)檢測(cè)
- httpclient的disableConnectionState方法工作流程
- 探索HttpClient中的close方法及其對(duì)連接的影響
- HttpClient的RedirectStrategy重定向處理核心機(jī)制
- HttpClient的DnsResolver自定義DNS解析另一種選擇深入研究
- HttpClient HttpRoutePlanner接口確定請(qǐng)求目標(biāo)路由
- 提升網(wǎng)絡(luò)請(qǐng)求穩(wěn)定性HttpClient的重試機(jī)制深入理解
- httpclient getPoolEntryBlocking連接池方法源碼解讀
相關(guān)文章
利用Java實(shí)現(xiàn)調(diào)用http請(qǐng)求
在實(shí)際開(kāi)發(fā)過(guò)程中,我們經(jīng)常需要調(diào)用對(duì)方提供的接口或測(cè)試自己寫(xiě)的接口是否合適。本文就為大家準(zhǔn)備了幾個(gè)java調(diào)用http請(qǐng)求的幾種常見(jiàn)方式,需要的可以參考一下2022-08-08在Mybatis @Select注解中實(shí)現(xiàn)拼寫(xiě)動(dòng)態(tài)sql
這篇文章主要介紹了在Mybatis @Select注解中實(shí)現(xiàn)拼寫(xiě)動(dòng)態(tài)sql,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11Java?NIO?Buffer實(shí)現(xiàn)原理詳解
本篇文章主要對(duì)NIO核心三件套:緩沖區(qū)(Buffer)、選擇器?(Selector)和通道(Channel),其中之一的緩沖區(qū)Buffer實(shí)現(xiàn)原理的學(xué)習(xí)總結(jié)。感興趣的小伙伴可以了解一下2021-11-11WIN10系統(tǒng)中添加bat腳本重啟jar服務(wù)
在bat腳本中執(zhí)行java服務(wù),命令與cmd中類似,下面這篇文章主要給大家介紹了關(guān)于WIN10系統(tǒng)中添加bat腳本重啟jar服務(wù)的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12SpringCloud Feign如何在遠(yuǎn)程調(diào)用中傳輸文件
這篇文章主要介紹了SpringCloud Feign如何在遠(yuǎn)程調(diào)用中傳輸文件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09解決IDEA中快捷鍵Alt+Enter不能使用的問(wèn)題
這篇文章主要介紹了解決IDEA中快捷鍵Alt+Enter不能使用的問(wèn)題,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12