如何设置Hystrix线程池大小
设置服务中每个 hystrix 线程池的大小,以及 如何设置超时时间呢?
假设你的服务A,每秒钟会接收30个请求,同时会向服务B发起30个请求,然后每个请求的响应时长经验值大概在200ms
那么你的hystrix线程池需要多少个线程呢?
计算公式:
每秒 高峰访问次数 * 访问延时 + bufferThread
timeout 设为 200ms, 每秒100个请求---->计算结果:100*0.2+10=30 个线程,两台虚拟机 可以解决
如果每秒 访问次数30000怎么办?
30000 * 0.2 + 100 =6100 个线程
6100 / 20 =305 台虚拟机 也可以搞定
虚拟机: 4 个cpu core ,4G内存
物理机 : 十几个cpu core ,几十个G的内存,5~8 个虚拟机,这里 1台物理机=6台虚拟机
305 台虚拟机 = 51 台物理机~搞定
对于线程池大小,一般控制在 10个 左右,20个 以内,最少5个
如何设置请求超时时间
请求的超时时间设置为多少?答案是 300ms
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 200 # 设置熔断超时时间 default 1000
timeout:
enabled: true # 打开超时熔断功能 default true
ribbon:
ConnectTimeout: 1000 # 设置连接超时时间 default 2000
ReadTimeout: 1000 # 设置读取超时时间 default 5000
OkToRetryOnAllOperations: true # 对所有操作请求都进行重试 default false
MaxAutoRetriesNextServer: 1 # 切换实例的重试次数 default 1
MaxAutoRetries: 1 # 对当前实例的重试次数 default 0
因为一个接口,
理论的最佳响应速度应该在 200ms 以内,或者慢点的接口就几百毫秒
yaml配置
<!--httpClient 的依赖 -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
<!--ribbon 的依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
<version>2.2.7.RELEASE</version>
</dependency>
<!--hystrix 的依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.2.7.RELEASE</version>
</dependency>
<!--openfeign 的依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.7.RELEASE</version>
</dependency>
<!-- mysql 驱动的依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
<!-- mybatis-plus 的依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
server:
servlet:
context-path: /content #前缀
port: 8080
spring:
application:
name: spring-test # 应用名
cloud:
nacos:
# nacos 地址
server-addr: 127.0.0.1:8848
# discovery:
# cluster-name: HZ #集群名称
# gateway:
# routes: # 网关路由配置
# - id: service-hosp # 路由id,自定义,只要 唯一即可
# # uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址
# uri: lb://service-hosp
# # /*代表一级,/** 代表多级
# predicates:
# # /a/hosp/c/d 满足 /a/hosp/ 也满足
# - Path=/*/hosp/** # 将含有hosp的uri 转发到service-hosp这个服务,lb 代表负载均衡
# filters:
# # 服务的熔断和降级配置(内置的过滤器)
# - name: Hystrix
# args:
# name: default
# fallbackUri: 'forward:/defaultFallback' # 服务降级转发到 /defaultFallback 这个接口
# # 网关的限流过滤器配置(内置的过滤器)
# - name: RequestRateLimiter
# args:
# key-resolver: '#{@pathKeyResolver}' # 使用 SpEL 表达式按名称引用bean,一共有三种,名称请查看配置对象
# redis-rate-limiter.replenishRate: 1 # 令牌桶每秒填充速率
# redis-rate-limiter.burstCapacity: 2 # 令牌桶总的容量大小,写2方便测试
# 配置数据源信息
datasource:
druid:
# 高并发场景下,万一遇到网络问题,可能会导致你跟数据库的Socket连接异常无法通信
connect-timeout: 1200 # 建立TCP连接的超时时间
socket-timeout: 3000 # 发送请求后 等待响应的超时时间
max-wait: 800 # 0.8s 以上, 大量线程获取不到连接,0.8s 左右快速就失败
# 连接数 <= (核心数 * 2) + 有效磁盘数
maxActive: 20 # 确实有高并发场景,可以适当增加到3~5倍,不超过 100
initial-size: 5 # 初始化大小
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.111.101:3306/reggie?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: 123456
# jackson的全局时间格式
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: Asia/Shanghai
redis:
host: 192.168.111.101
port: 6379
password:
database: 0
timeout: 3000
lettuce:
pool:
max-active: 10 # 最大连接
max-idle: 5 # 最大空闲连接
min-idle: 3 # 最小空闲连接
max-wait: 100 # 连接等待时间
# cluster:
# max-redirects: 3
# nodes:
mybatis-plus:
configuration:
# 数据库字段:user_id===>实体属性:userId
map-underscore-to-camel-case: true
# 打印sql日志
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
id-type: ASSIGN_ID # 采用 分布式ID策略
# 逻辑删除字段
logic-delete-field: isDeleted
# 正常值
logic-not-delete-value: 0
# 删除值
logic-delete-value: 1
# mapper的地址,类路径
mapper-locations: classpath*:com/xconline/mapper/xml/*.xml
feign:
client:
config:
default: # default全局的配置
connectTimeout: 10000 # 连接超时设置
readTimeout: 60000 # 执行超时配置
loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息
httpclient:
enabled: true # 开启 feign对HttpClient的支持
max-connections: 200 # 最大的连接数
max-connections-per-route: 50 # 每个路径的最大连接数
hystrix:
enabled: true # 开启熔断机制
compression:
request:
enabled: true # 配置请求GZIP压缩
mime-types: [ "text/xml","application/xml","application/json" ] # 配置压缩支持的MIME TYPE
min-request-size: 2048 # 配置压缩数据大小的下限
response:
enabled: true # 配置 响应 GZIP压缩
hystrix:
command:
default:
execution:
isolation:
strategy: THREAD # THREAD|SEMAPHORE
thread:
timeoutInMilliseconds: 300 # 设置熔断超时时间 default 1000
timeout:
enabled: true # 打开超时熔断功能 default true
ribbon:
ConnectTimeout: 10000 # 设置连接超时时间 default 2000
ReadTimeout: 2000 # 设置读取超时时间 default 5000
OkToRetryOnAllOperations: true # 对所有操作请求都进行重试 default false
MaxAutoRetriesNextServer: 2 # 切换实例的重试次数 default 1
MaxAutoRetries: 2 # 对当前实例的重试次数 default 0