三、Hystrixのフォールトトレランス
Hystrixは、主にフォールトトレランスを追加することで、ヘルプコントロールにこれらの分散サービス間の相互作用を遅延し、フォールトトレラントな方法を可能にしました。アイソレーションとの間のアクセスポイントサービスを通じて、それらの間のカスケード接続障害を防止し、これによりシステムの全体的な回復力を改善し、これを達成するために、フォールバックオプションを提供します。Hystrixは、主に以下のフォールトトレラントの方法を提供します。
- リソースの分離
- ヒューズ
- 降格
図1に示すように、リソース隔離 - スレッドプール
図2に示すように、リソースの分離 - セマフォ
スレッドプールとセマフォアイソレーションが比較します
スレッドの切り替え | 非同期サポート | タイムアウトのサポート | サポートヒューズ | 限定的 | 支出 | |
---|---|---|---|---|---|---|
セマフォ | ノー | ノー | ノー | それはあります | それはあります | 小さな |
スレッドプール | それはあります | それはあります | それはあります | それはあります | それはあります | すばらしいです |
サービス要求ネットワークのオーバーヘッドが比較的大きい場合には、時間がかかり、または要求は、私たちの最高のあなたは、コンテナ(Tomcatの)大量のを保証することができますので、糸分離戦略を使用することで、スレッドは、サービスの理由は、されていないため、提供されていますブロックまたは待機状態で、すぐに戻すことに失敗しました。そして、私たちは、これらのサービスをキャッシュ要求したとき、我々はそのようなサービスは通常、非常に高速に返されるので、長すぎるコンテナのスレッドを取るだけでなく、オーバーヘッド切り替えるスレッドの数を減らし、改善されません、セマフォ分離戦略を使用することができますキャッシュ・サービスの効率。
シナリオの大半のためのスレッド・プール、依存サービス要求のネットワークへの呼び出し、外部からのアクセスへのアクセスのためのセマフォが依存していませんが、より複雑なビジネスロジックのいくつかの内部へのアクセスは、普通のセマフォの制限を行いますその上を流れます。
図3に示すように、ヒューズ
なぜ、回路ブレーカを使用しますか?
分散アーキテクチャでは、アプリケーションは1つが高すぎるスレッドが起こる遅延に起因するブロックされ、高い関連事業QPS場合依存サービスがブロックされる呼び出し依存している場合、大量生産することが可能で、より多くのサービスは非常に共通している依存しています閉塞、サーバーのリソースが枯渇し、磨耗しているため、アプリケーション/サービスになります。障害がアバランシェ効果サービスを引き起こす可能性があればまた、障害がアプリケーション間で渡される、アップストリームサービスの詳細に依存しています。
次のように詳細なプロセスは、作業を融合さ:
allowRequest()を呼び出す最初のステップは、要求は、スレッドプールに提出できるようにするかどうかを決定します
1、如果熔断器强制打开,circuitBreaker.forceOpen为true,不允许放行,返回。
2、如果熔断器强制关闭,circuitBreaker.forceClosed为true,允许放行。此外不必关注熔断器实际状态,也就是说熔断器仍然会维护统计数据和开关状态,只是不生效而已。
第二步,调用isOpen()判断熔断器开关是否打开
1、如果熔断器开关打开,进入第三步,否则继续;
2、如果一个周期内总的请求数小于circuitBreaker.requestVolumeThreshold的值,允许请求放行,否则继续;
3、如果一个周期内错误率小于circuitBreaker.errorThresholdPercentage的值,允许请求放行。否则,打开熔断器开关,进入第三步。
第三步,调用allowSingleTest()判断是否允许单个请求通行,检查依赖服务是否恢复
1、如果熔断器打开,且距离熔断器打开的时间或上一次试探请求放行的时间超过circuitBreaker.sleepWindowInMilliseconds的值时,熔断器器进入半开状态,允许放行一个试探请求;否则,不允许放行。
此外,为了提供决策依据,每个熔断器默认维护了10个bucket,每秒一个bucket,当新的bucket被创建时,最旧的bucket会被抛弃。其中每个blucket维护了请求成功、失败、超时、拒绝的计数器,Hystrix负责收集并统计这些计数器。
执行策略如下:
Hystrix遇到一个超时/失败请求,此时启动一个10s的窗口,后续的请求会进行如下判断:
(1)查看失败次数是否超过最小调用次数
- 如果没有超过,则放行请求。
- 如果超过最小请求数,继续下面逻辑
(2)判断失败率是否超过一个阈值,这里错误是指超时和失败两种。
- 如果没有超过,则放行
- 如果超过错误阈值,则继续下面逻辑
(3)熔断器断开
- 请求会直接返回失败。
- 会开一个5s的窗口,每隔5s调用一次请求,如果成功,表示下游服务恢复,否则继续保持断路器断开状态。
4、降级
降级,通常指务高峰期,为了保证核心服务正常运行,需要停掉一些不太重要的业务,或者某些服务不可用时,执行备用逻辑从故障服务中快速失败或快速返回,以保障主体业务不受影响。
要支持回退或降级处理,一般是查询操作,可以重写HystrixCommand的getFallBack方法或HystrixObservableCommand的resumeWithFallback方法,通常不建议在回退逻辑中执行任何可能失败的操作。
Hystrix在以下几种情况下会走降级逻辑:
- 执行construct()或run()抛出异常
- 熔断器打开导致命令短路
- 命令的线程池和队列或信号量的容量超额,命令被拒绝
- 命令执行超时
如果降级逻辑中需要发起远程调用,建议重新封装一个HystrixCommand,使用不同的ThreadPoolKey,与主线程池进行隔离。
四、Hystrix配置
Hystrix默认使用Netflix Archaius进行配置管理,项目中使用zookeeper作为配置源,通过archaius-zookeeper实现hystrix命令、熔断器、线程池、监控等参数的动态配置,根据生产环境需要动态调整hystrix参数,实现了对微服务的治理。
每个Hystrix参数都有4个地方可以配置,优先级从低到高如下,如果每个地方都配置相同的属性,则优先级高的值会覆盖优先级低的值:
- 内置全局默认值:写死在Hystrix代码里的默认值,如HystrixCommandProperties.default_executionTimeoutInMilliseconds属性
- 动态全局默认属性:全局配置文件读到的默认值
- 内置实例默认值:创建HystrixCommand时,通过注解或者给父类构造器传参的方式设置的默认值
- ダイナミック構成プロパティの例:属性値によって、コンフィギュレーションファイルの具体的な例
タイムアウトhystrix sns.grassSearchIndexコマンド実行は、一例として提供され、優先度がローからハイに属性
default_executionTimeoutInMilliseconds=1000
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=500
HystrixCommandProperties.Setter().withExecutionTimeoutInMilliseconds(1000)
hystrix.command.sns.grassSearchIndex.execution.isolation.thread.timeoutInMilliseconds=1500
コマンドの設定
# 隔离策略: 可选THREAD|SEMAPHORE,默认TREAD
hystrix.command.default.execution.isolation.strategy=TREAD
# 服务超时时间,单位毫秒,默认1000
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=3000
# 服务sns.grassSearchIndex超时时间
hystrix.command.sns.grassSearchIndex.execution.isolation.thread.timeoutInMilliseconds=2000
# 是否打开超时检测,默认启用true
hystrix.command.default.execution.timeout.enabled=true
# 使用信号量隔离时qps阈值,后续的请求会被拒,默认10
hystrix.command.default.execution.isolation.semaphore.maxConcurrentRequests=10
ヒューズ(サーキットブレーカー)の設定
# 是否打开断路器,默认开启true
hystrix.command.default.circuitBreaker.enabled=true
# 断路器检测的基础请求值,只有时间窗口内的请求数达到这个阈值时,才会判定错误率,否则比如只有一两个请求,即便都失败了,也不会打开断路器,因为基数太少了,默认20
hystrix.command.default.circuitBreaker.requestVolumeThreshold=100
# 错误百分比,超过就会短路,默认值50
hystrix.command.default.circuitBreaker.errorThresholdPercentage=75
# 指的是从断路器打开状态到半开半闭状态需要的时间,即断路后,需要等多久才能放一个请求进来,默认值5000
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=5000
# Metrics
# 统计的时间窗口大小,默认10000
hystrix.command.default.metrics.rollingStats.timeInMilliseconds=10000
# 时间窗口的桶的数目,必须能被时间窗口大小整除,否则报错,每个bucket包含success,failure,timeout,rejection的次数的统计信息,默认10
hystrix.command.default.metrics.rollingStats.numBuckets=10
# 每一次检测的间隙。因为就算分窗口统计错误率,也会很占cpu,所以每一次统计都会等一个时间间隔再开始,默认500
hystrix.command.default.metrics.healthSnapshot.intervalInMilliseconds=500
# 带rollingPercentile的都表示调用时延的统计,该选项表示是否打开时延统计,比如说95分位99分位等,如果关闭都返回-1,默认true
hystrix.command.default.metrics.rollingPercentile.enabled=true
# 时延统计的时间窗口,默认60000
hystrix.command.default.metrics.rollingPercentile.timeInMilliseconds=60000
# 时延统计的桶数目
hystrix.command.default.metrics.rollingPercentile.numBuckets=6
# 时延统计的桶大小,时延统计每一个桶只维持最新的该数值的请求的数据,早一些的将会被覆盖。如果bucket size=100,window=10s,若这10s里有500次执行,只有最后100次执行会被统计到bucket里去,增加该值会增加内存开销以及排序的开销,默认100
hystrix.command.default.metrics.rollingPercentile.bucketSize=100
スレッドプール(ThreadPoolの)構成
# 默认核心线程数,不会变,默认10
hystrix.threadpool.default.coreSize=30
# userLogin隔离线程池核心线程数
hystrix.threadpool.userLogin.coreSize=20
# 等待队列,还超就会被拒,这个数值无法动态修改,默认-1
hystrix.threadpool.default.maxQueueSize=50000
# userLogin隔离线程池等待队列
hystrix.threadpool.userLogin.maxQueueSize=3000
# 进入queue时被拒的概率值,即便是没有达到maxQueueSize。这个为了弥补上面无法动态修改的不足。可以通过这个概率值来控制队列大小
hystrix.threadpool.default.queueSizeRejectionThreshold=45000
#线程池统计指标的时间,默认10000
hystrix.threadpool.default.metrics.rollingStats.timeInMilliseconds=10000
#将rolling window划分为n个buckets,默认10
hystrix.threadpool.default.metrics.rollingStats.numBuckets=10
第五に、サービス監視
Hystrixダッシュボード
Hystrixダッシュボードは、主情報Hystrixの指標のリアルタイム監視のために使用されます。Hystrixダッシュボードフィードバックによるリアルタイムの情報は、私たちはすぐにシステムの問題を特定するのに役立ちます。
https://search.maven.org // localhostを:7979 / hystrix-パッケージ後のダウンロードスタンドアロン-hystrix-ダッシュボードサイト、訪問のhttpジャーランダッシュボード/、 あなたが入力できhystrixのダッシュボードページ
nohup java -jar -DserverPort=7979 -DbindAddress=localhost standalone-hystrix-dashboard-1.5.3-all.jar &
クラスタ化環境の監視は、タービンNetflixの提供を監視するために使用することができます。Mavenの公共サービスによってhttps://search.maven.orgダウンロードおよびデプロイ戦争パッケージタービン・ウェブ、クラスタノード構成、タービンアドレスのhttp修正する:// localhostを:$ {ポート}を監視追加/turbine.stream?cluster=defaultダッシュボードへ
turbine.aggregator.clusterConfig=default
turbine.instanceUrlSuffix=:8080/gateway/hystrix.stream
turbine.ConfigPropertyBasedDiscovery.test.instances=10.66.70.1,10.66.70.2,10.66.70.3