博客
关于我
httpclient超时重试记录
阅读量:211 次
发布时间:2019-02-28

本文共 1022 字,大约阅读时间需要 3 分钟。

Apache HttpClient配置与重试策略分析

背景

在高并发场景下,线上服务依赖第三方服务时,接口响应时间过长的问题经常会影响系统性能。针对我们的场景,接口超时设置为5秒,这意味着如果请求在5秒内未完成,会被认为是超时失败。为了解决这一问题,我们需要合理配置HttpClient的连接池和重试策略。

构造HttpClient

通过debug可以观察到,HttpClient的build方法会返回一个InternalHttpClient对象。默认的执行链是RetryExec,使用DefaultHttpRequestRetryHandler作为重试策略。RetryExec会根据配置的重试策略决定是否重试请求。

超时参数

HttpClient的超时设置通常包括三个维度:

  • 连接超时(setConnectTimeout)
  • 读取超时(setSocketTimeout)
  • 从连接池获取连接超时(setConnectionRequestTimeout)
  • 每个超时参数都需要根据具体场景进行调整。例如,在高并发情况下,连接池的最大连接数和单个路由的最大并发量都需要进行优化。

    重试策略对业务的影响

    默认的HttpClient配置会自动处理重试策略,但在某些情况下,我们需要手动调整或关闭重试功能。重试策略的设置会影响业务的稳定性和性能,因此需要谨慎配置。

    重试分析

    对于HTTP GET和POST请求,重试策略主要基于以下因素:

    • 可重试异常:包括IOException及其子类,但需要排除以下几种情况:

      • InterruptedIOException(线程中断异常)
      • UnknownHostException(找不到主机)
      • ConnectException(连接失败)
      • SSLException(HTTPS认证失败)
    • 重试次数:默认设置会根据请求类型进行调整。例如,GET请求会在socket读取超时时进行3次重试,POST请求则会在write和flush操作失败时进行3次重试。

    禁止重试

    如果某些异常不支持重试,可以在非RetriableClasses列表中添加对应的异常类。例如,线程中断异常会被默认禁止重试。要手动关闭重试策略,可以在HttpClientBuilder中设置自动RetriesDisabled为true。

    参考

    • Apache HttpClient官方文档
    • HttpClient重试策略配置示例
    • 高并发场景下的HTTP客户端优化

    转载地址:http://hrbp.baihongyu.com/

    你可能感兴趣的文章
    MySQL中interactive_timeout和wait_timeout的区别
    查看>>
    mysql中int、bigint、smallint 和 tinyint的区别、char和varchar的区别详细介绍
    查看>>
    mysql中json_extract的使用方法
    查看>>
    mysql中json_extract的使用方法
    查看>>
    mysql中kill掉所有锁表的进程
    查看>>
    mysql中like % %模糊查询
    查看>>
    MySql中mvcc学习记录
    查看>>
    mysql中null和空字符串的区别与问题!
    查看>>
    MySQL中ON DUPLICATE KEY UPDATE的介绍与使用、批量更新、存在即更新不存在则插入
    查看>>
    MYSQL中TINYINT的取值范围
    查看>>
    MySQL中UPDATE语句的神奇技巧,让你操作数据库如虎添翼!
    查看>>
    Mysql中varchar类型数字排序不对踩坑记录
    查看>>
    MySQL中一条SQL语句到底是如何执行的呢?
    查看>>
    MySQL中你必须知道的10件事,1.5万字!
    查看>>
    MySQL中使用IN()查询到底走不走索引?
    查看>>
    Mysql中使用存储过程插入decimal和时间数据递增的模拟数据
    查看>>
    MySql中关于geometry类型的数据_空的时候如何插入处理_需用null_空字符串插入会报错_Cannot get geometry object from dat---MySql工作笔记003
    查看>>
    mysql中出现Incorrect DECIMAL value: '0' for column '' at row -1错误解决方案
    查看>>
    mysql中出现Unit mysql.service could not be found 的解决方法
    查看>>
    mysql中出现update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在 dpkg: 处理软件包 mysql-server-8.0的解决方法(全)
    查看>>