博客
关于我
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 中日志的面试题总结
    查看>>
    MySQL 中随机抽样:order by rand limit 的替代方案
    查看>>
    MySQL 为什么需要两阶段提交?
    查看>>
    mysql 为某个字段的值加前缀、去掉前缀
    查看>>
    mysql 主从 lock_mysql 主从同步权限mysql 行锁的实现
    查看>>
    mysql 主从互备份_mysql互为主从实战设置详解及自动化备份(Centos7.2)
    查看>>
    mysql 主键重复则覆盖_数据库主键不能重复
    查看>>
    Mysql 优化 or
    查看>>
    mysql 优化器 key_mysql – 选择*和查询优化器
    查看>>
    MySQL 优化:Explain 执行计划详解
    查看>>
    Mysql 会导致锁表的语法
    查看>>
    mysql 使用sql文件恢复数据库
    查看>>
    mysql 修改默认字符集为utf8
    查看>>
    Mysql 共享锁
    查看>>
    MySQL 内核深度优化
    查看>>
    mysql 内连接、自然连接、外连接的区别
    查看>>
    mysql 写入慢优化
    查看>>
    mysql 分组统计SQL语句
    查看>>
    Mysql 分页
    查看>>
    Mysql 分页语句 Limit原理
    查看>>