博客
关于我
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/

    你可能感兴趣的文章
    MySQL5.7.37windows解压版的安装使用
    查看>>
    mysql5.7免费下载地址
    查看>>
    mysql5.7命令总结
    查看>>
    mysql5.7安装
    查看>>
    mysql5.7性能调优my.ini
    查看>>
    MySQL5.7新增Performance Schema表
    查看>>
    Mysql5.7深入学习 1.MySQL 5.7 中的新增功能
    查看>>
    Webpack 之 basic chunk graph
    查看>>
    Mysql5.7版本单机版my.cnf配置文件
    查看>>
    mysql5.7的安装和Navicat的安装
    查看>>
    mysql5.7示例数据库_Linux MySQL5.7多实例数据库配置
    查看>>
    Mysql8 数据库安装及主从配置 | Spring Cloud 2
    查看>>
    mysql8 配置文件配置group 问题 sql语句group不能使用报错解决 mysql8.X版本的my.cnf配置文件 my.cnf文件 能够使用的my.cnf配置文件
    查看>>
    MySQL8.0.29启动报错Different lower_case_table_names settings for server (‘0‘) and data dictionary (‘1‘)
    查看>>
    MYSQL8.0以上忘记root密码
    查看>>
    Mysql8.0以上重置初始密码的方法
    查看>>
    mysql8.0新特性-自增变量的持久化
    查看>>
    Mysql8.0注意url变更写法
    查看>>
    Mysql8.0的特性
    查看>>
    MySQL8修改密码报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
    查看>>