SpringCloudブレーカ(Hystrix)とサービス低下見ケース

サーキットブレーカー(Hystrix) 

なぜHystrix?

マイクロサービスアーキテクチャでは、我々は、彼らがサービスとサービスの間で(RPC)お互いを呼び出すことができ、一つのサービスに事業を分割します。ためにその可用性を確保するため、および単一のサービスクラスタの展開でなければなりません。問題が発生した場合、ネットワーク上の理由として、あるいは自分自身の理由のために、サービスは、単一のサービスを利用可能なサービスの100%を保証するものではありませんネットワークの多数の流入は、サービスにつながる、累積タスクを形成する場合は、サービスネットワークが、この時点では、遅延されます呼び出しますでも麻痺、およびサービスにつながる「雪崩」。この問題を解決するために、回路ブレーカモデルが登場しました。
Hystrixはタイムアウトと対話するときに処理し、フォールトトレラント分散システム、それはまた、システムを保護する能力を持っているを解決するためのクラスライブラリです。雪崩サービスは何
分散システム全体のシステムサービスの根本的な原因のでしょう、多くの場合、1では使用できません使用できません。この現象は、雪崩効果サービスと呼ばれている。Hystrixは別のオプションを提供してくれ、表示されている間、雪崩のサービスに対応するために、一般的な方法は、手動でサービス低下にあります。

対処戦略雪崩サービス

様々な理由雪崩のサービスのために、あなたは別の対処戦略を使用することができます:
1.フローコントロール
2.改善されたキャッシュモード
3.自動拡張サービス
4.サービス呼び出し側のダウングレード
の流れを制御するための具体的措置は、次のとおりです
。1.ゲートウェイ制限
2。ユーザーとの対話絞り
3.閉じる再試行

雪崩のサービス・ソリューション

理由の1。サービスの雪崩

(1)いくつかの機械的な故障:いくつかのバグは、(例えば、メモリデッドロックまたは割り込み)は、例えばによるマシンまたは特定のマシンに、間違ったハードドライブ上に表示されます。
(2)サーバーの負荷の変化を:時々あるため、ユーザーの行動のサービス要求は、このようなアリのように雪崩、二から一一活動につながる処理できない原因となる、事前に推定フローマシンの増加がない場合、サーバーが突然の圧力を増加させるようになります2ハング。
(3)人的要因:コード・パスをバグが時々生じるような

雪崩サービスプログラムを解決したり、軽減する2

第三の溶液中の主に一般的なサービス依存保護のための:
(1)融合モード:このモードは、主にライン電圧が高すぎると、参照回路を吹き吹きヒューズや火災を防止します。私たちのシステムに、ターゲットサービスの呼び出しが遅いか、多くの時間がある場合には有効期限が切れ、ターゲット・サービス、ダイレクトリターン、クイックリリースのリソースを呼び出すために継続していない、サービス、後続の呼び出しの要求を呼び出すために吹き飛ばさ。目標は、状況の改善、サービスコールを復元する場合。
(2)分離モード:一つの島に同じタイプの要求に応じてシステムのこのモードは、島が火災である場合、より少ない光が他の島に影響を与えないであろう。例えば、リクエストの種類ごとに互いに独立して、スレッドプールリソースの分離への要求の異なるタイプのために使用することができる、リソースの枯渇要求スレッドの一種であれば、その後の要求の種類ではなく、リソースを呼び出す、直接戻されます。このモードは、非常に多くのシーンを使用して重要なサービスは、多施設を促進するために、最近、再び別のサーバーを展開するために使用し、またはのために、例えば、サービスを開きます。
(3)モード制限:電流制限モードが予防モードと呼ぶことができるが、モード及び誤差後のフォールトトレラント処理機構に属する上記ヒューズ分離モード。上記の閾値は、代わりにリソースを呼び出すので、要求に直接返すように設定されている場合、モードは主に、予め設定された制限することで、要求のタイプごとに、最も高いしきい値をQPS。このモデルは、要求がアバランシェ効果を生じさせる可能性がまだ制限されていないため、依存、唯一、資源配分システムの全体的な問題を解決することができるサービスの問題を解決するものではありません。

3.ヒューズ設計

主基準hystrixアプローチのヒューズ設計で。最も重要な三つのモジュール:要求決意アルゴリズムヒューズ、ヒューズ回復メカニズム、警報ヒューズ
要求決意機構アルゴリズム融合(1):ロックフリーキュー・カウント・サイクル、各ヒューズデフォルトの保守バケット10を、毎秒バケツ、各レコード要求blucketの成功、失敗、タイムアウトは、20上の状態、デフォルトの要求のエラーを拒否し、10秒以内に50%以上が傍受を中断します。
(2)回復を融合:リクエストが健康(RT <250msの)健康の回復のために要求されている場合は吹き飛ばさすべての5Sの要求は、によって、いくつかの要求を許可します。
(3)アラームを融合:吹きプレイログの要求のために、異常警報設定要求は、特定超え

4.分離デザイン

通常、2つの分離方法
(1)スレッドプールの分離モード:スレッドプールを使用して現在のリクエスト、リクエストキュースレッドプールに、タイムアウト設定処理タスクに戻り、固め見掛けスレッドプールを処理するための要求を格納します。このアプローチは、各従属サービス要求スレッドプールのために必要となる、特定のリソースの消費量があり、利点は、(トラフィックのピークが来る、ゆっくり処理するスレッドプールのチームに格納されたデータの処理を完了することはできません)バースト性トラフィックに対処することができます
( 2)信号分離モード量:実行中のスレッドの現在の数を記録するカウンタ原子(またはセマフォ)を使用して、カウンタの第1の要求判定値は、スレッドの最大数は、変更要求の新しいタイプを提供超えるが、破棄されます要求カウンタがカウント動作+1を実行以上あれば、-1カウンタ要求が返されます。このアプローチは、厳密にスレッドを返すバーストトラフィックに対処することができませんでしただちにモード、制御され(トラフィックのピークが来ると、スレッドは、私たちが要求されたサービスに依存し続けていない、他の要求の数が直接返されます超えます)

5タイムアウト機構設計

2種類のタイムアウト、1はタイムアウト要求のタイムアウトを実行するための要求を待つことです。
待機タイムアウト:キュー時間にタスクを設定し、HOLキュー時間を決定する作業は、ときに、タスクキュータスクを捨てるよりも、タイムアウト期間よりも大きいです。
実行タイムアウト:直接法は、スレッドプールを提供します使用することができます

ヒューズメカニズムとは何ですか

問題は、システム全体のダウンの正常な動作を確保し、サービスをダウングレードするためのメカニズムを提供するために、下流のサービスを発生した後、あるメカニズムを、融合し、システム全体がアバランシェ効果が現れる避け、キャッシュされたデータやデータを返すことによって確立しました。springcloudでは、この機能は、設定により、プロジェクトに追加することができます。

Hystrixの役割

1.回路遮断器機構

回路遮断器のバックエンドサービス要求がHystrixコマンド量が一定の割合(デフォルト50%)を超えると、回路ブレーカが開状態(オープン)に切り替えます失敗したときだけでなく、それを理解されたい。この場合、すべての要求は、バックエンド・サービスの障害に直接送信されていません回路ブレーカ一定期間後に開いた状態のまま(デフォルトでは5秒)が自動的に半開状態(ハーフオープン)に切り替わります。リクエストが成功した場合は、この場合の状況を返すように要求が決定されます、サーキットブレーカーのスイッチバックの閉鎖状態( Hystrix遮断器はヒューズで私たちの家族のように、バックエンドサービスが利用できないと、回路ブレーカは、リクエストの直接チェーンを切断されますされて開放状態(OPEN)。にCLOSED)、またはスイッチバックは無効な要求の多くは、システムのスループットに影響を与える送信しないようにしますそして、回路遮断器は、自己テストおよび回復する能力を持っています。

2.Fallback

バックエンドサービスリクエスト例外は、あなたが値をフォールバック方式のリターンを使用することができたときにフォールバック同等のダウングレード。クエリ操作のために、我々は、フォールバック方式を実現することができます。戻り値は通常セットのデフォルト値であるか、キャッシュのフォールバック方式から。

3.リソースの分離

Hystrixで我々は、リモートサービスコール基づいて、複数のスレッドプールに主に通常の使用では、分離を達成するために、スレッドプールのリソースによって分割されますとき。例えば、通話のために商品やサービスのコマンドAのスレッドプールの中に、コマンドの呼び出しアカウントサービスを置きます

サービス低下見える例

サービス低下とは何ですか

サービス低下が最も重要なトピックの一つは、サービスプロバイダが利用できない場合、プログラムは例外ではないだろう、と地元の操作が調整されることを、いわゆる降格手段であるすべてのRPC技術

application.ymlプロフィール

##アプリケーション名
春:
  応用:
    名前:順序 - サービス
##ポート番号
サーバ:
  ポート: 9002
  ## Tomcatはスレッドの最大数を設定します
  Tomcatの:
    最大 -threads:50
アドレス登録センターを指定するには、それらを登録するための##の登録センター
ユーレカ:
  クライアント:
    サービス - URL:
      defaultzone:HTTP:// localhostを:8001 /ユーレカ
##の構成リボン読書の時間
リボン:
  ReadTimeout: 15000 
  のconnecttimeout: 15000
ブレーカーをオンにします##

私たちは睡眠3Sにスレッドので##、デフォルトのサービスのメンバーは呼び出しが失敗したとして、それはクラスのサービス低下を実行します1秒以上で奉仕を呼び出し、我々は、サービスの応答時間を設定することができます
hystrix:
  コマンド:
    デフォルト
      実行:
        アイソレーション:
          糸:
            timeoutInMilliseconds: 4000

MemberServiceクラス

パッケージcom.cloud.service。

輸入com.cloud.MemberServiceFallBack;
輸入org.springframework.cloud.openfeign.FeignClient;
輸入org.springframework.web.bind.annotation.RequestMapping。

/ **
 *フォールバックサービスは、ローカルクラスを実行するために格下げされました
 * / 
@FeignClient(値 = "memeberサービス"、フォールバック= MemberServiceFallBack。クラスパブリック インターフェースMemberService {
     / **
     *入手メンバーシップ情報
     * @return 
     * / 
    @RequestMapping( "/ getMember" 公共の文字列getMember();
}

MemberServiceFallBack类

パッケージcom.cloud。

輸入com.cloud.service.MemberService。
輸入org.springframework.stereotype.Component;

/ **
 *ローカルサービス
 * /
@成分
パブリック クラス MemberServiceFallBack 実装MemberService {
    @オーバーライド
    パブリック文字列GetMember(){
         戻り「サービス低下」
    }
}

OrderController类

パッケージcom.cloud.controller。

輸入com.cloud.service.MemberService。
輸入com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
輸入org.springframework.web.bind.annotation.RequestMapping。
輸入org.springframework.web.bind.annotation.RestController;
輸入org.springframework.web.client.RestTemplate;

輸入javax.annotation.Resource;

@RestController
パブリック クラスOrderController {
    @資源
    プライベート休憩テンプレート残りのテンプレート。

    @RequestMapping( "/ getOrderByMember" 
    @HystrixCommand(fallbackMethod = "getOrderHystrix" パブリック文字列getOrderByMemberは(){
         戻り restTemplate.getForObject( "HTTP:// memeberサービス/ getMember"、ストリングクラス)。
    }

    パブリック文字列getOrderHystrix(){
         リターン「サービスヒューズ」
    }

    (@RequestMapping "/ getOrderInfo" パブリック文字列getOrderInfo(){
         リターン "getOrderInfo" 
    }
}

スタートクラスStartOrders

@SpringBootApplication
@EnableEurekaClient
@EnableHystrix
パブリック クラスStartOrders {
     公共 静的 ボイドメイン(文字列[]引数){
        SpringApplication.run(StartOrders。クラス、引数)。
    }

    @豆
    @LoadBalanced
    テンプレート残留休止テンプレート(){
        返す 新しいRestTemplateを();
    }
}

おすすめ

転載: www.cnblogs.com/dabrk/p/12077151.html