OkHttp - maxRequests & maxRequestPerHost

问题描述

最近发现项目的性能压测有问题,后来排查发现是因为 maxRequestPerHost 引发的性能瓶颈,那顺便来看看:maxRequests & maxRequestPerHost 区别

 

原因分析

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

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

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

默认:5,一般建议与maxRequest保持一致。这个值设置,有如下几个场景考虑:

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

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

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

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

解决方案

Dispatcher dispatcher = client.dispatcher();
dispatcher.setMaxRequestsPerHost(1000);
dispatcher.setMaxRequests(1000);

Tips:设置为 1000 后基本可以满足业务要求~

你可能感兴趣的:(#,JavaWeb,okhttp,java,maxRequests,PerHost,并发数,默认值,64,5,executorService)