背景

项目中使用OkHttp访问三方服务

参数

创建okhttp客户端类的时候需要设置一些参数,有些可能是坑,仅供参考:

client = new OkHttpClient.Builder()

.dispatcher(new Dispatcher(executorService))

.connectionPool(new ConnectionPool(maxIdleConnections, keepAliveDurationMills, TimeUnit.MILLISECONDS))

.readTimeout(readTimeoutMills, TimeUnit.MILLISECONDS)

.connectTimeout(connectTimeoutMills, TimeUnit.MILLISECONDS)

.writeTimeout(writeTimeoutMills, TimeUnit.MILLISECONDS)

.protocols(Util.immutableList(Protocol.HTTP_1_1))

.connectionSpecs(Arrays.asList(TLS_SPEC, ConnectionSpec.CLEARTEXT))

.build();

client.dispatcher().setMaxRequests(maxRequests);

client.dispatcher().setMaxRequestsPerHost(maxRequestsPerHost);

参数

意义

推荐值及原则

executorService

内部执行http请求的实际线程池

默认executorService = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60, TimeUnit.SECONDS,

new SynchronousQueue<Runnable>(), Util.threadFactory("OkHttp Dispatcher", false));

没有常驻线程,性能低,线程没有限制上限。

maxIdleConnections

连接池大小,指单个okhttpclient实例所有连接的连接池。

默认:5,值的设置与业务请求量有关,如果请求三方的tps是200,建议这个值设置在200左右。

keepAliveDurationMills

连接池中连接的最大时长

默认5分钟,依据业务场景来确定有效时间,如果不确定,那就保持5分钟

connectTimeoutMills

连接的最大超时时间

默认10秒

readTimeoutMills

读超时

默认10秒,如果是流式读,那建议设置长一点时间。

With this option set to a non-zero timeout, a read() call on the InputStream associated with this Socket will block for only this amount of time. If the timeout expires, a java.net.SocketTimeoutException is raised, though the Socket is still valid.

writeTimeoutMills

写超时

默认10秒,如果是流式写,那建议设置长一点时间

maxRequests

当前okhttpclient实例最大的并发请求数

默认:64,默认的64一般满足不了业务需要。这个值一般要大于maxRequestPerHost,如果这个值小于maxRequestPerHost会导致,请求单个主机的并发不可能超过maxRequest.

maxRequestPerHost

单个主机最大请求并发数,这里的主机指被请求方主机,一般可以理解对调用方有限流作用。注意:websocket请求不受这个限制。

默认:4,一般建议与maxRequest保持一致。

这个值设置,有如下几个场景考虑:

(1)如果被调用方的并发能力只能支持200,那这个值最好不要超过200,否则对调用方有压力;

(2)如果当前okhttpclient实例只对一个调用方发起调用,那这个值与maxRequests保持一致;

(3)如果当前okhttpclient实例在一个事务中对n个调用方发起调用,n * maxReuestPerHost要接近maxRequest

maxRequests和maxReuestsPerHost值的设置与executorService线程池的设置有关联,请注意。maxRequests和maxRequestPerHost是okhttp内部维持的请求队列,而executorservice是实际发送请求的线程。如果maxRequests和maxReuestPerHost设置太大,executorService会因为线程太少而阻塞发送。

对okhttp参数的一些思考的更多相关文章

  1. 关于LeNet-5卷积神经网络 S2层与C3层连接的参数计算的思考???

    https://blog.csdn.net/saw009/article/details/80590245 关于LeNet-5卷积神经网络 S2层与C3层连接的参数计算的思考??? 首先图1是LeNe ...

  2. 关于.NET参数传递方式的思考

    年关将近,整个人已经没有了工作和写作的激情,估计这个时候很多人跟我差不多,该相亲的相亲,该聚会喝酒的聚会喝酒,总之就是没有了干活的心思(我有很多想法,但就是叫不动我的手脚,所以我只能看着别人在做我想做 ...

  3. 【转】maven命令-P 参数引发的思考

    序言: maven 命令:clean package -Dmaven.test.skip=true -P product 1.命令很简单是:清class文件,打包构建,跳过测试,注意最后一个 -P p ...

  4. maven命令-P 参数引发的思考

    参考文档: https://blog.csdn.net/haiyuntai/article/details/53260191 谢谢原作者 maven 命令:clean package -Dmaven. ...

  5. es6函数的rest参数和拓展运算符(...)的解析

    es6的新特性对函数的功能新增加了rest参数和...的拓展运算符.这是两个什么东西呢? 先来看一个问题:如何获取一个函数除了定义的参数之外的其他参数?传统的做法是借助函数的arguments关键字来 ...

  6. 如何将自定义的搜索参数便捷的添加到js方式的bootstrap table的参数中

    页面: <div> <form id="exp_form"> 查询参数... <button type="button" oncl ...

  7. 登录首页时报错:java.lang.IllegalArgumentException (不合法的参数异常)

    处理一个老项目,DOWN下项目并配好之后,启动没问题,但是登陆之后首页显示如下: 控制台报错如下: 严重: Servlet.service() for servlet jsp threw except ...

  8. Mybatis学习笔记5 - 参数处理

    1.单个参数:mybatis不会做特殊处理,#{参数名}:取出参数值. 2.多个参数:mybatis会做特殊处理. 多个参数会被封装成 一个map, key:param1...paramN,或者参数的 ...

  9. spring-boot如何去获取前端传递的参数

    本文主要讨论spring-boot如何获取前端传过来的参数,这些参数主要有两大类,一类是URL里的参数,一个是请求body里的参数 url里的参数 通过url里传过来的参数一般有三种方式,下面我们来看 ...

随机推荐

  1. 【转载】C#中string.IsNullOrEmpty和string.IsNullOrWhiteSpace区别

    在C#中判断字段是否为空或者Null的时候,我们一般会使用到string.IsNullOrEmpty和string.IsNullOrWhiteSpace方法,这两个方法在大部分情况下判断的结果是一致的 ...

  2. Vue的11个生命周期函数的用法

    实例的生命周期函数(官方11个):beforeCreate:在实例部分(事件/生命周期)初始化完成之后调用.created:在完成外部的注入/双向的绑定等的初始化之后调用.beforeMount:在页 ...

  3. iOS加解密最重要的干货:CCCrypt

    需要引入框架#import <CommonCrypto/CommonCryptor.h> 函数定义: CCCryptorStatus CCCrypt( CCOperation op, /* ...

  4. GC是如何判断一个对象为"垃圾"的?被GC判断为"垃圾"的对象一定会被回收吗?

    一.GC如何判断一个对象为”垃圾”的java堆内存中存放着几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”.那么GC具体通过什么手段来 ...

  5. SpringBoot+SpringCloud+vue+Element开发项目——集成Druid数据源

    添加依赖 pom.xml <!--druid--> <dependency> <groupId>com.alibaba</groupId> <ar ...

  6. Python学习日记(十五) collections模块

    在内置函数(dict.list.set.tuple)的基础上,collections模块还提供了几个其他的数据类型:Counter.deque.defaultdict.namedtuple和Order ...

  7. 【DRF框架】认证组件

    DRF框架的认证组件 核心代码:       self.perform_authentication(request)  框架自带模块:    from rest_framework import a ...

  8. kubernetes 基本概念和资源对象汇总

    kubernetes 基本概念和知识点脑图 基本概念 kubernetes 中的绝大部分概念都抽象成kubernets管理的资源对象,主要有以下类别: Master : Master节点是kubern ...

  9. 公用表表达式(CTE) with as

    在编写T-SQL代码时,往往需要临时存储某些结果集.前面我们已经广泛使用和介绍了两种临时存储结果集的方法:临时表和表变量.除此之外,还可以使用公用表表达式的方法.公用表表达式(Common Table ...

  10. CF: Long Number

                                                    题目链接 #include<iostream> #include<string> ...